我经常在c语言的头文件中看到下面的代码:
#ifdef __cplusplus extern “c” { #endif // all of your legacy c code here #ifdef __cplusplus } #endif
这通常用于c++和c混合编程的时候,为了防止c++的编译器在编译c文件的时候出现错误;
众所周知,c++可以进行函数名重载,但是c则没有这种功能,那这和extern “c”又有什么关系呢?
先看下面这个表格,如下所示;
语言 描述
c 函数名可以作为唯一id和代码段的程序建立联系
c++ 因为重载的关系,函数名符号会被破坏,从而会根据函数的参数不同而重新生成函数符号
未添加 extern “c”
test.h
#ifndef test_h #define test_h void foo1(void); void foo2(void); void foo3(int i); #endif
test.c
void foo1(void){} void foo2(void) {} void foo3(int i){} int main(int argc,char** argv){ foo1(); foo2(); foo3(1); return 0; }
编译这两个文件,生成test.o文件,通过objdump查看函数符号;
g++ -c test.c test.h objdump -t test.o
可以看到函数符号已经被编译器修改了;
添加extern “c”
test.h
#ifndef test_h #define test_h #ifdef __cplusplus extern “c” { #endif void foo1(void); void foo2(void); void foo3(int i); #ifdef __cplusplus } #endif #endif
test.c
#ifdef __cplusplus extern “c” { #endif void foo1(void){} void foo2(void) {} void foo3(int i){} #ifdef __cplusplus } #endif int main(int argc,char** argv){ foo1(); foo2(); foo3(1); return 0; }
编译这两个文件,生成test.o文件,通过objdump查看函数符号;
g++ -c test.c test.h objdump -t test.o
这时候函数符号是正确的;
extern “c” 是告诉c++的编译器不要打我这些c函数的主意。
好了,这次分享的比较简单,也挺实用,我们下期再见。
end
作者:菜刀和小麦
来源:小麦大叔
版权归原作者所有,如有侵权,请联系删除。
工业智能网关如何实现环保HJ212协议的云端通信
CIS传感器:光学模组核心部件之一
nfc功能怎么用
电感器和变压器的分类和主要特性参数及线圈的详细资料说明
当冬奥遇上AR,高新兴立体防控云防系统全力护航盛会
你真的知道C语言里extern C有什么作用吗
步进电机的选购方法
Vivado Waveform功能使用技巧详解
财政补贴退坡成为新能源汽车洗牌主因
Nook电子阅读器今年销量有望达6万部
人工智能行业迎来发展拐点
黑莓收购Cylance 交易金额将达15亿
电机控制器结构设计框架介绍
从2021年起,新加坡可以通过人脸识别进行各种服务
2019年的八大AI趋势浅析
蔚华科技推动半导体检测跨时代应用 昕诺飞提供无线光通信系统
三星8K QLED电视已开售 戴尔双屏设备新专利曝光
服务器集群yum如何安装软件详细方法说明
米尔科技Versatile Express 的软宏单元模型介绍
IBeacon技术将如何实现室内蓝牙定位