【C&C++】链接指示:关于“#ifdef __cplusplus” 和 “extern “C“” 的问题

1. extern "C"

为了在C++代码中调用用C写成的库文件,就需要用extern "C"来告诉编译器:这是一个用C写成的库文件。

因为不能使用cpp编译器去编译c文件,因而要加上extern "C"告诉编译器应当以C的方式来链接它们。

extern "C"链接指示的这种形式包含一个关键字extern,后面是一个字符串值常量,以及普通的函数声明。因为关联C语言,所以添加"C"。 为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C。

为了链接多个声明,在链接指示后面跟上花括号若干声明从而一次性建立多个连接。

因此多重声明用于整个头文件可以在头文件夹中如是引用。

#ifdef __cplusplus 
extern "C" { 
#endif 
 
//一段代码 
 
#ifdef __cplusplus 
} 
#endif

C和C++对函数的处理方式是不同的。extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

2. 对接到C的预处理器的支持

在C和C++中编译同一个源文件,在编译cpp版本的程序时加入预处理器定义__cplusplus,利用这个变量,在编译cpp时可以有条件的包含一些代码。

#ifdef __cplusplus  //判断以下是否编译的时cpp程序

3.  在C++中引用C函数

//test.c
#include <stdio.h>
void mytest()
{
printf("mytest in .c file ok\n");
}
//main.cpp
extern "C"
{
void mytest(); //声明函数就行了
}
int main()
{
mytest();
return 0;
}

4. 在C中引用C++函数

在C中引用C++语言中的函数和变量时,C++的函数或变量要声明在extern "C"{}里,但是在C语言中不能使用extern "C",否则编译出错。

//test.cpp
#include <stdio.h>
extern "C"
{
void mytest()
{
printf("mytest in .cpp file ok\n");
}
}
//main.c
void mytest(); //声明函数就行了
int main()
{
mytest();
return 0;
}

5. 综合使用

一般我们都将函数声明放在头文件,当我们的函数有可能被C或C++使用时,但我们无法确定函数是在c还是cpp里面被定义,也就无法确定是否要将函数声明在extern "C"里,所以,我们应该添加
xxx.h

这样,可以将mytest()的实现放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"后使用头文件里面的函数,而不会出现编译错误。一般情况下,只需要把_cpluscplus和extern "C"的关键字放到h文件就行了,c文件和cpp文件包含这个头文件,而不需要在加入这两个关键字。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米杰的声音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值