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

为什么需要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

正常表示调用成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值