c语言中extern是直接改变函数值吗

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” 这种错误。

当你编译工程时,提示此错误,可以查查是不是函数修饰规则的问题。

本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023-01-30 11:42
下一篇 2023-01-30 13:51

相关推荐

  • 亚马逊发布新款fire hd,重新定义低价平板是真的吗

    IT之家(***):亚马逊发布新款Fire HD,重新定义低价平板 亚马逊今天发布了大量新品,包括Kindle Fire HDX 8.9英寸平板电脑,新的Kindle Voyage…

    2023-07-17
  • 如何解决手机自动安装软件

    手机上安装不了软件不难排除呢! 1.很多手机由于前期购买的时候配置低,很多客户都买的是山寨机,这样的机子往往配置很低,想要装软件进去是不可能的,只有系统预装的软件。 2.机身内存不…

    2023-03-08
  • 口袋妖怪圣灰攻略图文一周目

    本攻略完全按照收集图鉴的路程走,可能会出现一些抢夺神奇宝贝之类的行为,如果不喜欢,可以按照原剧情走。本攻略建议配合金手指使用。 开始游戏,男孩,默认名称小智。 首先出现在家里,去电…

    2023-05-06
  • 小米note3人脸解锁是真的吗

    现在很多安卓手机都支持人脸识别,但在技术层次上和苹果iPhone X的没法比。 iPhone X Face ID人脸识别是用了一整套的原深感摄像头系统,在刘海区域内安置了红外摄像头…

    2023-08-31
  • 支付宝上线医保个人账户查询迁

    IT之家 9 月 7 日消息,支付宝宣布现已开通“医保个人账户余额查询”服务,进入支付宝医保电子凭证页面即可一键查询参保状态以及账户余额,同时也可查看个人医保缴纳情况以及个人就医购…

    2022-12-21
  • 怎样让二维码微信支付宝都可以扫

    随着移动支付的普及,现在很多人只要带着手机,一天所有的消费都可以通过扫一扫来解决,连外国人都对此羡慕不已。而大家使用地最多的移动支付平台,肯定是微信和支付宝了,我们知道微信和支付宝…

    2022-12-26
  • 如何提高自我意识

    培养孩子完整的自我意识 第一 增强社会互动,帮助孩子获得客体存在感 (1)对孩子微笑和说话。 (2)让孩子照镜子。如果4到5个月大的婴儿经常从镜子里看见自己,并跟大人一起玩社会性的…

    2023-04-12
  • 中国电信手机服务密码如何重置或者修改?

    客户服务密码,这是手机号的高级密码,有这不可替代的作用,用户可以用密码查详单,办理业务等等等等。但是很多人根本不知道自己手机号码的客户服务密码,下面给大家说说小知识,让大家了解一下…

    2024-01-11
  • app store 审核被拒

    为了避免不必要的上线延迟及成本增加,了解App Store审核被拒的常见原因以及对应的解决方案,是非常重要的。本文汇总了App Store审核被拒的常见原因,希望能给你带来帮助。 …

    2023-02-20
  • s换机助手 三星如何操作

    前几天,我给大家分享过三星手机之间的数据迁移小妙招. 都对苹果与三星手机之间的数据迁移问题存在很多疑惑. 好了,废话不多说,我来给大家分享一下 苹果与三星手机之间数据迁移的正确打开…

    2023-02-19