/Gd、/Gr、/Gz(调用约定)
这些选项用于确定函数参数入栈的顺序,调用结束时调用方函数或被调用函数是否从堆栈中移除参数,以及编译器用来标识各个函数的名称修饰约定。
/Gd
/Gr
/Gz
备注
提示
这些编译器选项仅在面向 x86 的编译器中可用,它们在面向 x64 或 Itanium 的编译器中不可用。
/Gd 为默认设置,为除 C++ 成员函数和标记为 __stdcall 或 __fastcall 的函数以外的所有函数指定 __cdecl 调用约定。
/Gr 为除 C++ 成员函数和标记为 __cdecl 或 __stdcall 的函数以外的所有函数指定 __fastcall 调用约定。 所有 __fastcall 函数必须具有原型。
/Gz 为除 C++ 成员函数和标记为 __cdecl 或 __fastcall 的函数以外的所有函数指定 __stdcall 调用约定。 所有 __stdcall 函数必须具有原型。
参数个数可变的函数必须标记为 __cdecl。
/Gd、/Gr 和 /Gz 与 /clr:safe 或 /clr:pure 不兼容。
提示
对于 x86 处理器,默认情况下 C++ 成员函数使用 __thiscall。
对于所有处理器,显式标记为 __cdecl、__fastcall 或 __stdcall 的成员函数使用指定的调用约定。 采用的参数个数可变的成员函数总是使用 __cdecl 调用约定。
__cdecl 细节
对于 C,__cdecl 命名约定使用前面带下划线 (_) 的函数名;不执行任何大小写转换。 除非声明为 extern "C",否则 C++ 函数将使用不同的名称修饰方案。 有关更多信息,请参见修饰名。
__fastcall 细节
__fastcall 函数的一些参数传入寄存器(对于 x86 处理器,为 ECX 和 EDX),而其余的参数按从右向左的顺序入栈。 被调用例程在返回之前从堆栈中弹出这些参数。 通常,/Gr 将缩短执行时间。
提示
在对用内联程序集语言编写的任何函数使用 __fastcall 调用约定时,一定要小心。 您对寄存器的使用可能与编译器对它们的使用发生冲突。
对于 C,__fastcall 命名约定使用前面带“at”符 (@) 的函数名,后跟函数参数大小(以字节为单位)。 不执行任何大小写转换。 编译器使用下列命名约定模板:
@function_name@number
当使用 __fastcall 命名约定时,请使用标准包含文件。 否则将获取无法解析的外部引用。
__stdcall 细节
__stdcall 函数的参数被从右到左推送到堆栈上,被调用函数在返回之前从堆栈中弹出这些参数。
对于 C,__stdcall 命名约定使用前面带下划线 (_) 的函数名,后跟“at”符 (@) 和函数的参数大小(以字节为单位)。 不执行任何大小写转换。 编译器使用下列命名约定模板:
_functionname@number
x86 特定
此选项对 C++ 方法和函数的名称修饰无效。 除非声明为 extern "C",否则 C++ 方法和函数将使用不同的名称修饰方案。 有关更多信息,请参见修饰名。
有关调用约定的更多信息,请参见 Calling Conventions。
END x86 Specific
在 Visual Studio 开发环境中设置此编译器选项
打开此项目的**“属性页”**对话框。 有关详细信息,请参见如何:打开项目属性页。
单击**“C/C++”**文件夹。
单击**“高级”**属性页。
修改**“调用约定”**属性。
以编程方式设置此编译器选项
- 请参见 CallingConvention。