理解extern "C",C++函数与C函数互调

来源:互联网 发布:吉翔数据 编辑:程序博客网 时间:2024/06/04 18:54

为什么需要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 _cplusplusextern "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]$ ./bhello

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

正常表示调用成功。

0 0