c语言指数常数的正确表示形式(C语言基础extern)
visual C 编译器在编译函数时,会对函数名进行修饰,现在小编就来说说关于c语言指数常数的正确表示形式?下面内容希望能帮助到你,我们来一起看看吧!
c语言指数常数的正确表示形式
visual C 编译器在编译函数时,会对函数名进行修饰。
如果没听过函数名修饰,咱们先做个试验,有个直观的认识。
#include "stdafx.h"
extern void func(int a,int b,long c);
int main(int argc, char* argv[])
{
func(1,2,5);
printf("Hello World!\n");
return 0;
}
如以上代码所示,func函数只有声明,没有定义。 这个工程也之后这一个c文件。
我们编译工程,得到如下错误。
error LNK2001: unresolved external symbol "void __cdecl func(int,int,long)" (?func@@YAXHHJ@Z)
无法解析的外部符号?func@@YAXHHJ@Z ,看到了吗,func函数在后台的名字是?func@@YAXHHJ@Z
这就是对函数名的修饰。
为什么是?func@@YAXHHJ@Z 这样的呢?
函数名的修饰规则是:? 函数名 @@ 调用规则 返回值类型 参数类型 @Z
调用规则VC 包含三种:
1.__cdecl在修饰规则里是YA,我们的例子中就是这种, ?func@@YAXHHJ@Z。
2.__stdcall在命令规则里是YG 。
3.__fastcall在命令规则里是YI。
这三种调用规则对于函数参数的传递方式和入栈顺序也不同,我们以后在讲。
返回值类型和参数类型如下:
X--void
D--char
E--unsigned char
F--short
H--int
I--unsigned int
J--long
K--unsigned long(DWORD)
M--float
N--double
_N--bool
U--struct
以上就是visual C 编译器的函数修饰规则。确切的说是C 语言的修饰规则。
那么 extern “C"是什么呢?
这个符号是告诉编译器,按C语言的修饰规则修饰。
我们加上“C",看看C语言的修饰规则是什么样的。
#include "stdafx.h"
extern "C" void func(int a,int b,long c);
int main(int argc, char* argv[])
{
func(1,2,5);
printf("Hello World!\n");
return 0;
}
编译结果如下:
error LNK2001: unresolved external symbol _func
看到了吗,C语言的规则就是简单的在函数名前面,加了一个下划线。
那么我们为什么要折腾函数名的修饰规则呢?有什么用?
比如当你调用别人编译的库时,就需要知道对方是用什么规则编译的,你调用的时候也要用这种规则,不然就会提示“error LNK2001: unresolved external symbol XXXX” 这种错误。
当你编译工程时,提示此错误,可以查查是不是函数修饰规则的问题。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com