Каково соглашение о вызовах по умолчанию для экспортируемых функций (VS2008)? - PullRequest
2 голосов
/ 07 ноября 2011

Учитывая следующий код C ++, который не упоминает соглашение о вызовах в объявлении функции, каким будет соглашение о вызовах для экспортируемой функции Exported?Я предполагаю, что по умолчанию будет cdecl.

extern "C"
{
  __declspec (dllexport) bool Exported(int parm);
}

Я вызываю эту функцию из управляемого кода, используя LoadLibrary, GetProcAddress и Marshal.GetDelegateForFunctionPointer.Я могу украсить свое определение делегата различными значениями атрибута UnmanagedFunctionPointer, и все они кажутся работающими.

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Соглашение о вызовах по умолчанию - cdecl. Обратите внимание, что __declspec (dllexport) не влияет на соглашение о вызовах.

Соглашение о вызовах может быть указано в коде или с помощью опции компилятора. Я не рекомендую использовать опцию компилятора, она слишком непонятна. Сделайте это явным образом в коде, а затем любой, кто читает, знает, какое соглашение используется.

Обратите внимание, что для 64-битного кода Windows все соглашения о вызовах эквивалентны, что может объяснить то, что вы видите.

2 голосов
/ 07 ноября 2011

Соглашение о вызовах по умолчанию также зависит от некоторых переключателей компилятора:

В c / c ++ -> advanced вы можете установить его:

/ Gd = cdecl, / Gz = stdcall, / Gr= fastcall

...