赞
踩
extern "C"
是C++特有的指令(C无法使用该指令),目的在于支持C++与C混合编程。
extern “C”
的作用是告诉C++编译器
(如g++)用C规则
编译指定的代码
除函数重载外,
extern "C"
不影响C++其他特性;
这是因为C和C++的编译规则不一样,主要区别体现在编译期间生成函数符号的规则
不一致。请看如下范例:
/*------------------func1.h头文件------------------*/
#include <stdio.h>
void func1(); //declare
/*-----------------func1.c C源码文件----------------*/
#include "func1.h"
void func1()
{
printf("Hello world!\n");
}
/*--------------main.cpp C++源码文件-------------*/
#include "func1.h"
int main()
{
func1();
return 0;
}
//采用gcc进行编译,将报错!但是采用g++编译却正常;细看错误详情可知,是main()函数
内找不到func1()函数
报错,即编译阶段没报错,是链接的阶段
报错了!
gcc main.cpp func1.c -o hello //
gcc编译报错,错误如下图所示
g++ main.cpp func1.c -o hello //
g++编译正常
C++支持函数重载
,而C不支持。正是因为C++需要支持重载,因此单纯的函数名已无法区分出具体调用的函数,因此在编译阶段就需要将形参列表
作为附加项增加到函数符号中。
func1.c文件
中的func1()函数
分别在C、C++对应的汇编码结果如下:
func1.s
:gcc -S func1.c
func1.s
:g++ -S func1.c
func1.o
:gcc -c func1.c
func1.o
:gcc -c func1.c
func1()函数
编译后对应的符号不同。C++编出来的函数符号明显比C的多出了一些信息(如__Z5),这里多出来的后缀信息就是形参列表
的参数类型信息。原因:这是因为
gcc
会根据源文件的尾缀(.c、.cpp等)利用相应的代码规则进行编译,如.c
(采用C规则
),.cpp
(采用C++规则
);但g++
对于.c、.cpp等文件一律采用C++规则
进行编译,故不报错!详见gcc与g++区别
extern "C"
的作用就是告诉C++编译器,将指定的函数用C规则编译:
该方法下,cpp文件不能再include func1()所在的头文件,如本例中的#include “func1.h” 需要被注释掉!!
/*--------------main.cpp C++源码文件-------------*/
//#include "func1.h" /*该include语句需被注释掉*/
extern "C" void func1();
int main()
{
func1();
return 0;
}
**推荐!**
)/*------------------func1.h头文件------------------*/
#ifdef __cplusplus//两个下划线_
extern "C"{
#endif//!__cplusplus
#include <stdio.h>
void func1();
#ifdef __cplusplus//两个__下划线
}
#endif//!__cplusplus
extern "C"
拓展,以免出现链接错误!extern "C"
带来的链接错误问题!但建议还是对C文件进行extern "C"
兼容!Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。