Visual C++ 编译器选项

释放双眼,带上耳机,听听看~!
  Visual C++ 编译器选项  

1
1

链接地址/Gd****、
/Gr、
/Gz(调用约定)

/Gd

/Gr

/Gz

这些选项确定:

  • 将函数参数推送到堆栈上的顺序。

  • 是由调用方函数还是由被调用函数在调用结束时从堆栈中移除参数。

  • 编译器用来标识各个函数的名称修饰约定。

/Gd
为默认设置,对除
C++ 成员函数和标记为 __stdcall
__fastcall
的函数以外的所有函数指定
C 调用约定。

/Gr
对除
C++ 成员函数和标记为 __cdecl
__stdcall
的函数以外的所有函数指定 __fastcall
调用约定。所有 **__fastcall **函数必须具有原型。

/Gz
对除采用的参数个数可变的函数和标记为 __cdecl
__fastcall
的函数以外的所有原型
C 函数指定 __stdcall
调用约定。所有 __stdcall
函数必须具有原型。

注意
   x86 Specific —>
默认情况下,
C++ 成员函数当其 this
指针在
ECX 寄存器中传递时使用调用约定。所有其他参数被从右到左推送到堆栈上,被调用例程从堆栈中弹出成员函数的参数。END x86 Specific
显式标记为 __cdecl__fastcall
__stdcall
的成员函数使用指定的调用约定。采用的参数个数可变的成员函数总是使用 __cdecl
调用约定。

**__cdecl **细节

对于
C,__cdecl
命名约定使用以下划线
( _ ) 开头的函数名;不执行任何大小写转换。除非声明为 extern
"C",否则
C++ 函数将使用不同的名称修饰方案。有关更多信息,请参见
修饰名

**__fastcall **细节

某些 **__fastcall **函数参数在寄存器 **x86 Specific —> **
ECX 和
EDX END x86 Specific 中传递,其余参数则被从右到左推送到堆栈上。被调用例程在返回之前从堆栈中弹出这些参数。
/Gr 通常减少执行时间。

注意
   
在对用内联程序集语言编写的任意函数使用 **__fastcall **调用约定时,一定要小心。您对寄存器的使用可能与编译器对它们的使用发生冲突。

对于
C,__fastcall
命名约定使用以
“at”符
(@) 开头的函数名,后跟函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:

@function_name@number

注意
   Microsoft
不保证不同编译器版本之间的 __fastcall
调用约定的实现相同。例如,
16 位编译器与
32 位编译器的实现就不同。

当使用 __fastcall
命名约定时,请使用标准包含文件。否则将获取无法解析的外部引用。

**__stdcall **细节

__stdcall

函数的参数被从右到左推送到堆栈上,被调用函数在返回之前从堆栈中弹出这些参数。

对于
C,__stdcall
命名约定使用以下划线
( _ ) 开头的函数名,后跟
“at”符
(@) 和函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:

_functionname@number

x86 Specific —>

此选项对
C++ 方法和函数的名称修饰无效。除非声明为 extern
"C",否则
C++ 方法和函数将使用不同的名称修饰方案。有关更多信息,请参见
修饰名

END x86 Specific

** **

给TA打赏
共{{data.count}}人
人已打赏
安全经验

Google Adsense 技巧提示100条

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索