#ifdef __cplusplus

本来这个是只应该出现在运用cpp编程的工程中的,但是,就算是单片机编程,都已经会看到这个了,所以提出来解释一下。

条件编译,属于c/c++共有的,但是由于在有些场合,在c++代码内嵌c语言能使编程更加便利。

使用c语言编译器gcc编译下面代码:

#include<stdio.h>

#ifdef __cplusplus
extern "C" {
#endif
    int a=10;
#ifdef __cplusplus
}
#endif
int main(void)
{
    printf("%d",a);
    return 0;
}

预编译(gcc -E)之后是这样的:

这样可以确定在C语言gcc编译器中是没有__cplusplus这个宏的,那么我们用g++编译器上面程序呢?

可以看出g++预编译之后,能够识别__cplusplus这个宏。

所以,结论已经很明显了。本来如同#ifdef  XXXXX这样的条件编译,需要人为定义一个匹配的宏,但是,在c++编译器中,已经内置了这个宏的定义,所以在使用c++编译器编译其他语言(这里是C语言,当然得编译器支持的语言哈)时,用上这样的方式,可以让编译器把extern “C”代码块中的内容按照C语言的编译方式进行编译。为什么要这样呢?因为c++中支持函数重载,而C语言不支持,c++对函数经过了其他处理,如果不加extern “C”限制按照C语言的方式编译,那么c++编译器在编译C语言函数时可能就会找不到链接路径而报错。

那么再看到下面这种代码,应该也不会再陌生了。

#ifdef __cplusplus
extern "C" {
#endif

/*add somethings*/

#ifdef __cplusplus
}
#endif

时间: 2024-10-17 18:40:44

#ifdef __cplusplus的相关文章

C++ 为什么要使用#ifdef __cplusplus extern &quot;C&quot; { #endif

转载:http://www.cnblogs.com/ayanmw/archive/2012/03/15/2398593.html 转载:http://blog.csdn.net/zkl99999/article/details/48134621 转载: http://www.jianshu.com/p/5d2eeeb93590 经常看到别人的头文件 有这样的代码 #ifdef __cplusplus extern "C" { #endif // C 样式 的函数 #ifdef __cp

#ifdef __cplusplus extern &quot;C&quot; { #endif”的定义

看一些程序的时候老是有 "#ifdef __cplusplus extern "C" { #endif"的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefined Macros __cplusplus Defined for C++ programs only. 意思是说,如果是C++程序,就使用 extern "C"{ 而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的 The following c

“#ifdef __cplusplus extern &quot;C&quot; { #endif”的定义

平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译. #ifdef __cplusplus extern "C" { #endif // 代码 #ifdef __cplusplus } #endif 这个是什么意思呢?一开始看到这个也很茫然.上网查找了一些资料. 主要作用: 为了在C++代码中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们. 原因:

#ifdef __cplusplus extern &quot;C&quot; { #endif

1.在好多程序中我们会遇到下面代码段 #ifdef __cplusplus        extern "C" {        #endif //c语法代码段 #ifdef __cplusplus        }        #endif // 首先应该知道,__cplusplus是CPP中的自定义宏,则表示这是一段cpp的代码,编译器按c++的方式编译系统..如果这时候我们需要使用c语言的代码,那么就需要加上(extern "C" { )这一段来说明,要不编

【转】#ifdef __cplusplus深度剖析

原文:http://bbs.ednchina.com/BLOG_ARTICLE_251752.HTM 时常在cpp的代码之中看到这样的代码:     #ifdef __cplusplus extern "C" {     #endif //一段代码     #ifdef __cplusplus } #endif  这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的

#ifdef __cplusplus extern &quot;C&quot; { #endif 的意思(转)

Microsoft-Specific Predefined Macros__cplusplus Defined for C++ programs only. 意思是说,如果是C++程序,就使用extern "C"{而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的 The following code shows a header file which can be used by C and C++ client applications:// MyCFuncs.h#i

#ifdef __cplusplus extern C{}与C和C++间的关系

#ifdef __cplusplus extern C{}与C和C++间的关系 1.1 问题是什么 解决在 1.在一个系统中.cpp文件的函数需要调用.c文件的函数,及需要gcc和g++编译的文件或文件的部分函数在同一个头文件中. 的情况下,如何正确的编译.链接. 1.2 基础知识 Compile the C code like this:     gcc -c -o somecode.o somecode.c Then the C++ code like this:     g++ -c -o

【转】#ifdef __cplusplus+extern &quot;C&quot;的用法

时常看到别人的头文件中,有这样的代码: 1 #ifdef __cplusplus 2 3 extern "C" { 4 5 #endif 6 7 //一段代码 8 9 #ifdef __cplusplus 10 11 } 12 13 #endif 这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{,和 }处理

undefined reference to `recvIpcMsg(int, ipc_msg*)&#39;——#ifdef __cplusplus extern &quot;C&quot; { #endif

最近在弄一个进程间通信,原始测试demon用c语言写的,经过测试ok,然后把接口封装起来了一个send,一个recv. 使用的时候send端是在一个c语言写的http服务端使用,编译ok没有报错,但是recv的使用在QT里面是C++的,编译的时候出现 undefined reference to `recvIpcMsg(int, ipc_msg*)' 报错. 检查了头文件和实现文件都在,编译成动态库了都,同样的方法在C文件里调用都没有报错,搬到C++里面就都报错了,突然想起来一件事我的头文件声明