VC++ 2008 zu cdecl zwingen
-
Hallo.
Aus bestimmten Gründen soll VC++ ein Programm von mir ausschließlich in der cdecl-Konvention kompilieren. Ich darf allerdings nicht die Bibliotheken selbst editieren, von daher kann ich nichts explizit vor eine Funktion schreiben.
cdecl ist als Standardkonvention gesetzt.Funktion:
int setfield(const char* string, State* state)
So sollte es aussehen:
signed int __cdecl setfield(const char *string, State* state)
Es wird aber so kompiliert:
signed int __usercall setfield<eax>(const char *string<edi>, State* state<esi>)
Wie kann ich den compiler zwingen die Optimierung sein zu lassen?
-
Hallo,
wenn als Standard-Aufrufkonvention __cdecl ausgewählt wurde oder die Funktion mit __cdecl deklariert wurde, dann hat sie auch diese Konvention.
Inwiefern "optimiert" er bei dir denn was und was soll __usercall sein?
-
FrEEzE2046 schrieb:
Hallo,
wenn als Standard-Aufrufkonvention __cdecl ausgewählt wurde oder die Funktion mit __cdecl deklariert wurde, dann hat sie auch diese Konvention.
Inwiefern "optimiert" er bei dir denn was und was soll __usercall sein?__usercall ist eine Bezeichnung von IDA.
Heißt dass es ein compilereigene Konvention ist und keine Standardkonvention.In diesem Fall nimmt die Funktion Argumente in den edi/esi Registern entgegen anstatt über den Stack.
-
Okay, ich versteh aber noch immer das Problem nicht.
Wenn die Funktion implizit als __usercall deklariert ist, dann muss dies doch irgendwo als Standard-Aufrufkonvention festgelegt worden sein (Compiler-Einstellung).
Ist ja nicht böse gemeint, aber wo ist das Problem diese auf __cdecl zu ändern?
-
FrEEzE2046 schrieb:
Okay, ich versteh aber noch immer das Problem nicht.
Wenn die Funktion implizit als __usercall deklariert ist, dann muss dies doch irgendwo als Standard-Aufrufkonvention festgelegt worden sein (Compiler-Einstellung).
Ist ja nicht böse gemeint, aber wo ist das Problem diese auf __cdecl zu ändern?Nein, Standard ist __cdecl.
Trotzdem scheint VC++ seinen Dickkopf durchzusetzen und macht eben etwas anderes wenn Register frei sind oä
-
Icematix schrieb:
Nein, Standard ist __cdecl.
Trotzdem scheint VC++ seinen Dickkopf durchzusetzen und macht eben etwas anderes wenn Register frei sind oäNaja, dass hängt davon ab mit welchen Einstellungen du kompilierst. Standard-Debug hat jegliche Optimierung abgeschaltet und sollte deine Funktionen auch wirklich so anlegen, wie es deklariert wurde.
Wenn du den Optimizer jedoch angeschaltet hast, wird er natürlich (z.B.) eine Funktion die nur ein einziges Mal mit den Werten X und Y aufgerufen wird; anders gestalten und zwar dann dahingehend, dass die Werte fest eingetragen werden und gar nichts mehr vom Stack geholt wird. Ggf. wird auch die ganze Funktion überhaupt nicht angelegt (da keine Notwendigkeit besteht), sondern inline eingefügt.
Mit welchen Parameter kompilierst du denn?