这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » C语言里extern"C"是什么意思?

共5条 1/1 1 跳转至

C语言里extern"C"是什么意思?

工程师
2020-09-09 23:56:10     打赏

经常在C语言的头文件中看到下面的代码:

#ifdef __cplusplus extern "C" { #endif // all of your legacy C code here #ifdef __cplusplus } #endif

这通常用于C++++和C混合编程的时候,为了防止C++的编译器在编译C文件的时候出现错误;众所周知,C++可以进行函数名重载,但是C则没有这种功能,那这和extern "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函数的主意。




工程师
2020-09-10 23:03:35     打赏
2楼

原来如此


工程师
2020-09-13 23:45:26     打赏
3楼

感谢分享


工程师
2020-09-15 00:30:15     打赏
4楼

学到了


工程师
2020-09-15 23:41:39     打赏
5楼

原来如此


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]