c/c++函数符号的生成规则

函数符号(函数的名字修饰):是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。

C和C++程序的函数在内部使用不同的名字修饰方式,下来就来进行详细的介绍:

1、C编译器的函数名修饰规则 

__cdecl调用约定(c标准调用约定):仅在输出函数名前加上一个下划线前缀,例如_sum

__stdcall调用约定(windows标准调用约定):编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数,例如 _sum@number

__fastcall调用约定(快速调用约定):在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,例如 @sum@number

2、 C++编译器的函数名修饰规则 

对于__stdcall方式,参数表的开始标识是“@@YG”,对于__cdecl方式则是“@@YA”,对于 __fastcall方式则是“@@YI”。

符号生成规则

_cdecl调用约定:“?”+函数名+参数表的开始标识 “@@YA” + 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

_stdcall调用约定:“?”+函数名+参数表的开始标识“@@YG”+函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

_fastcal调用约定:“?”+函数名+参数表的开始标识 “@@YI”+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
                                                                                参数表的拼写代号

XDEFHIJKMN_NUPA+PB+...
voidchar

unsigned

char

shortint

unsigned

int

long

unsigned

long

floatdoubleboolstruct指针+类型const指针+类型...

_thiscall调用约定(类成员方法的约定):“?” +函数名+ “@”字符引导的类名+参数表的开始标识(函数性质决定)+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

参数表的开始标识:公有(public)成员函数的标识“@@QAE”,保护(protected)成员函数的标识“@@IAE”,私有(private)成员函数“@@AAE”;如果使用Const ,则对应的标识“@@QBE”,“@@IBE”,“@@ABE”。
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
语义分析是编译器的重要阶段之一,其目的是对源代码进行分析,验证程序是否符合语法规则,并且检查代码是否存在语义错误。语义分析也可以进行类型检查,以确保变量的使用是正确的。 在语义分析的过程中,编译器会生成中间代码,作为进一步优化和生成目标代码的基础。中间代码是一种抽象的表达形式,它无关于特定的源代码语言和目标代码平台,可以供不同平台的代码生成器使用。 中间代码生成过程中,编译器会将源代码转化为一种中间表示形式,如三地址码、控制流图等。这些中间表示形式能够捕捉源代码中的语义信息,同时将其转化为一种易于理解和优化的形式。 中间代码生成可以通过多种方法实现,如递归下降、递归上升、语法制导翻译等。编译器会遍历源代码的语法树,根据语义规则进行语义分析,并将语义信息翻译为相应的中间代码表示。 在C语言中,语义分析主要包括类型检查、作用域分析、符号表管理等。类型检查会验证表达式、函数调用等的类型是否匹配,以避免类型错误;作用域分析会确定变量和函数的可见性和生命周期;符号表管理则维护变量和函数的信息,以供后续阶段使用。 综上所述,语义分析及中间代码生成是编译器的重要阶段,它们确保源代码的语义正确性,并生成中间代码作为后续编译优化和目标代码生成的依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值