导航:首页 > 源码编译 > c编译后为什么要加extern

c编译后为什么要加extern

发布时间:2023-10-26 23:49:24

① c++在进行c编译时,为什么要声明extent c

你要知道 有的时候 需要用c编译的程序调用c++编译的库或者c++源码里面的函数和类,
但是c和c++对于函数的处理是不同的,
比如说c编译函数的话,如void fun()处理后之后可能就是fun,
然而c++的话,可能会在前面加上很多修饰的前缀,就不是fun了,可能是什么g_fun,
具体我也不清楚,
由于c和c++对函数的处理方式不同的话,你在c++写函数要让c语言可以调用,那么就要加个东西表示要按c的方式编译函数,这就是加个extern "c"了,在c++语言里面使用c方式的函数,声明的时候也要加上extern "c"告诉编译器按c的方式去查找这个函数,否则的话可能会出现链接错误,

具体的详细说明可以去查询相关资料啊。。。c++ primer 4里面的最后一章好像有点说明,讲的简单明了,可以去看看哦。。。

关于文件后缀名是c还是cpp的,在vc6和vs2008等下面都是 分别按照对应语言处理的,要让编译器只按照c语法处理的话,要把后缀改成.c的,否则默认情况.cpp的话,即使源码里面是纯c的语法,还是会按照c++处理的,所以编译方式还是c++的,就体现不出extern "c"的作用了,要想体现出作用的话,可以建立.c和.cpp的文件或者工程尝试下。。。

② 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明

首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,
该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。
例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。
这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;
它会在连接阶段中从模块A编译生成的目标代码中找到此函数

extern"C"是连接申明(linkagedeclaration),
被extern"C"修饰的变量和函数是按照C语言方式编译和连接的,

来看看C++中对类似C的函数是怎样编译的:
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。
函数被C++编译后在符号库中的名字与c语言的不同。

例如,假设某个函数的原型为:
voidfoo(intx,inty);

该函数被C编译器编译后在符号库中的名字为_foo,
而C++编译器则会产生像_foo_int_int之类的名字
(不同的编译器可能生成的名字不同,
但是都采用了相同的机制,生成的新名字称为“mangledname”)。

_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,
C++就是靠这种机制来实现函数重载的。

例如,在C++中,函数voidfoo(intx,inty)与voidfoo(intx,floaty)
编译生成的符号是不相同的,后者为_foo_int_float。
同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。

用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。
而本质上,编译器在进行编译时,与函数的处理相似,
也为类中的变量取了一个独一无二的名字,
这个名字与用户程序中同名的全局变量名字不同。

本内容,引用自,里面有更详细的说明:
http://blog.csdn.net/ygm_linux/article/details/26626893

阅读全文

与c编译后为什么要加extern相关的资料

热点内容
用粘液做解压手套 浏览:327
icloud收信服务器地址 浏览:498
编程思考者 浏览:450
压缩机型号用什么氟利昂 浏览:553
农机空气压缩机 浏览:664
程序员下载歌曲 浏览:894
编译未检测到仿真器 浏览:807
压缩机每次启动12分钟就停 浏览:730
creo复制曲面命令 浏览:959
程序员恋上女硕士 浏览:669
ansys的get命令 浏览:988
国外dns苹果服务器地址 浏览:430
国家职业技术资格证书程序员 浏览:652
奇瑞租车app是什么 浏览:99
系统源码安装说明 浏览:420
命令行加壳 浏览:96
解压时显示防失效视频已加密 浏览:295
苹果短信加密发送 浏览:446
天翼私有云服务器租用 浏览:733
贵州云服务器属于哪个上市公司 浏览:59