为什么需要extern “C”?
extern “C” 是编译器链接指示符。需要知道,对于不同的编译器,在编译一个函数时,编译出来的函数名称或参数排列的顺序可能是不同的。这就导致用一种语言去调用另一种语言函数的时候,需要告诉编译器不同的编译器调用规则。extern “C”就是告诉编译器用C语言的规则去编译调用函数。
extern "C"有两种声明形式,一种是单一语句形式,如:
extern "C" int add(int x,int y);
另一种复合语句形式,如:
extern "C"
{
int add(int x,int y);
int max(int x,int y);
}
下面来看一个例子,以便更详细地说明extern “C”的意义所在:
#ifdef _cplusplus
extern "C"
{
#endif
...
#ifdef _cplusplus
}
#endif
_cplusplus是C++中的自定义宏,表明当前代码是一段C++代码。则这里表示:如果当前代码是C++代码,那么就用C语言的规则来编译这段代码。
实例:C++中调用C函数。
a.c
1 #include <stdio.h>
2
3 extern "C"
4 {
5 void test()
6 {
7 printf("hello\n");
8 return;
9 }
10 }
b.cpp
1 extern "C"
2 {
3 extern void test();
4 }
5
6 int main()
7 {
8 test();
9 return 0;
10 }
编译执行得:
[ch1n4@localhost extern]$ g++ a.c b.cpp -o b
[ch1n4@localhost extern]$ ./b
hello
C中调用C++函数
在C中引用C++语言中的函数和变量时,C++的头文件需要添加extern “C”,但是在C语言中不能直接引用声明了extern “C”的头文件,应该仅将C文件中在C++中定义的extern “C”函数声明为extern类型。
实例:
Example.h
1 #ifndef EXAMPLE_H
2 #define EXAMPLE_H
3 extern "C" int add(int x,int y);
4 #endif
Example.cpp
1 #include "Example.h"
2
3 int add(int x,int y)
4 {
5 return x + y;
6 }
Cfile.c
1 extern int add(int x,int y);
2
3 int main(int argc,char* argv[])
4 {
5 add(2,3);
6 return 0;
7 }
在C语言中不能直接引用声明了extern “C”的头文件。比如在Cfile.c中不能加上语句#include “Example.h”,应该仅在C文件中将C++中定义的extern”C”函数声明为extern类型,然后在代码中调用该函数。
编译执行:
[ch1n4@localhost extern]$ g++ -c Example.cpp -o Example.o
[ch1n4@localhost extern]$ gcc -c Cfile.c -o Cfile.o
[ch1n4@localhost extern]$ gcc Cfile.o Example.o -lstdc++
[ch1n4@localhost extern]$ ./a.out
正常表示调用成功。