bowie_22 hat geschrieben:Hallo Zusammen,
ich würde gerne verstehen, was genau eine Zeile wie
_CRTIMP double __cdecl __MINGW_NOTHROW atof (const char*); //MINGW
oder
[_Check_return_ _CRTIMP double __cdecl atof(_In_z_ const char *_String); //MSVC
in einer header Datei bedeutet.
Klare Ansage eines diplomierten Informatikers: Keine Ahnung
Naja, nicht ganz keine Ahnung, eine Ahnung habe ich schon, nur kein Wissen, aber vieles deutet ja schon darauf hin, was es sein könnte.
Wozu gibt es Google? ^^
bowie_22 hat geschrieben:
Mir ist klar, dass hier ein Funktionsprototyp für die Funktion namens atof steht, dass
- diese Funktion ein Argument vom Typ const char* erwartet
die Funktione einen Rückgabewert vom Typ double liefert
Mir ist nicht klar:
- was __cdeclp __MINGW_NOTHROW bzw. __cdecl bedeutet und bewirkt
was _CRTIM bzw. _Check_return_ _CRTIMP beudeutet und bewirkt
Das einzige was ich zu cedl rausgefunden habe sagt was über calling conventions ...
_cdecl steht für C-Deklaration. Eine Funktion, die wie eine C-Funktion gerufen wird. Pascal ist da wohl etwas anders strukturiert. Ansonsten gibt es noch _fastcall und vermutlich eine ganze Reihe anderer Möglichkeiten zu einem anderen Stück Code zu springen und dann irgendwie auch wieder zurück zu kommen. Hier klärt sich zum Beispiel, wie die Argumente auf dem Stack liegen und wer den Stack nach dem Aufruf wieder aufräumen soll - der Rufende, der den Stack ja auch aufgebaut hat oder die Funktion, die ja weiß, was sie bekommen hat und der Abbau ja nach dem Funktionsaufruf auch (theoretisch) immer gleich passieren muss - da kann es ja die Funktion machen, dann muss man das nicht immer wieder neu programmieren... der eine machts so, der andere so. _cdecl legt fest, wie es bei dieser Funktion läuft.
__MINGW_NOTHROW ist ein Makro, das - wie man schon am Namen erkennt - für MinGW spezifisch ist, also unter Visual Studio gar nicht läuft. Es erklärt dem Compiler, dass diese Funktion keine Exceptions werfen (throw) wird, der Compiler verlässt sich also darauf und kann hier optimieren.
_CRTIMP steht vermutlich für C RunTime Implementation: Das wird Microsoftspezifisch sein und teilt dem Compiler mit, dass er die Funktion über eine DLL einbinden muss (MSVCRTxx.DLL). Das ganze expandiert wohl zu _decl( dllimport ), was in Microsoft-Kauderwelch soviel heißt wie: Die Funktion findest Du erst beim Linken in einer DLL.
_check_return_ ist ebenfalls Microsoft spezifisch und weist den Compiler an, dass der Aufrufer der Funktion, das zurückgelieferte Ergebnis nicht ignorieren darf.
Der Aufruf
sollte also in einem Fehler (oder Warning) enden, was ja auch sinnvoll ist - wenn man sich für das Ergebnis nicht interessiert, kann man sich den Aufruf ja auch sparen. Die Funktion besitzt ansonsten ja keine Nebeneffekte (ändert also nichts am Programmablauf, sondern ist nur dafür da das Ergebnis zu produzieren, was dann ignoriert würde - hier muss also was verkehrt sein). Das ist aber kein Standard-C++, daher der Unterstrich und die eher C-untypische Schreibweise.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.