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

相关推荐

  • 这三个坏习惯会伤害你的手机寿命

    今天和大家分享一下,有哪些方面会影响我们手机的使用寿命? 毕竟现在的智能手机呢已经成为我们每个人的必需品。那么手机也和人一样,都有自己的寿命。大多数的手机呢之所以很快就会坏掉,往往…

    2023-12-31
  • 如何找回qq密码,如何找回qq密码方法

    如果我们的QQ密码不慎遗忘或者丢失,请不要着急,我们是可以通过正确的步骤一步一步找回我们的QQ密码的。 打开我们的QQ客户端,不论是手机客户端,或者是电脑客户端,平板客户端也可以,…

    2023-08-18
  • youtube海外推广营销策略是什么

    要论最佳的海外营销媒介,youtube可以算一个,相比其它形式,视频往往更具有优势,因为视频比图片或文字更引人入胜、充满更多的活力与乐趣。 YouTube是谷歌旗下的视频网站,也是…

    2023-04-15
  • vivo手机怎么样?

    VIVO作为目前国内出货量前二的手机品牌(目前实际上已经超过了OPPO成为了第一大手机品牌)你说值得不值得买,当然是值得买的。否则的话,VIVO怎么可能收获那么多的粉丝群体呢? 而…

    2023-05-06
  • 吉尔吉斯斯坦手机号是什么样的,塔吉克斯坦流量套餐

    吉尔吉斯坦为中亚东北部的内陆国,境内间流湖泊众多,水资源丰富,风景优美,具有较高的旅游价值。去吉尔吉斯斯坦旅行,手机上网和打电话是一定要解决的问题。东南亚e生活小编为您整理了以下常…

    2023-02-27
  • 中国联通怎么样查话费

    中国联通,最大的杀猪盘操盘手 什么是杀猪盘 简单来说,就是骗子在网上利用人性弱点 接近受害者,以虚假广告获取受害者信任后漏出真面目 让受害者掏出钱财并心甘情愿的为施骗者付出 常见的…

    2023-08-26
  • 塞班系统有多少个手机操作系统(手机塞班操作系统)

    小绿人和小苹果的出现撼动了它曾不可一世的宝座,狼来了的故事在它身上上演,如果不曾提起,它也许就此掩埋在时光的长滩上。或许你已经猜到,那个遥远而又熟悉的名字。 塞班。 1980 Da…

    2023-07-05
  • 如何用电脑查看自家wifi密码

    如何用电脑来查看已连接WiFi的密码?这个其实是非常简单的! 现在应该是用win10的朋友比较多吧,有不少人还不知道怎么找出已连接WiFi的密码的。我这里来补充一下吧! 一般大家喜…

    2023-08-25
  • 手机上怎么制作gif动态图片 动画

      想要在手机上制作gif动态图片,还不想下载软件的时候要怎么办呢?很简单,下面给大家分享两招在线gif制作(***/)的工具,不需要下载任何软件。小白也能轻松上手,支持原画质导出…

    2023-02-24
  • 十大经典htc手机你用过几部(htc手机哪款最好最实用)

    王雪红昨天刚刚辞任威盛董事长一职,准备专心提振HTC业绩。HTC自97年被她创办以来的发展之路经历了高潮和低谷,现如今面临营收减少、股价下跌两大压力,它们不得不做出裁员和缩减智能机…

    2023-06-14