常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif
这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern
"C"{和}处理其中的代码。
要明白为何使用extern
"C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.
示例1:
#include
<
stdio.h
>
int main() {
#define TO_LITERAL(text) TO_LITERAL_(text)
#define TO_LITERAL_(text) #text
#ifndef __cplusplus
/* this translation unit is being treated as a C one */
printf( " a C program\n " );
#else
// this translation unit is being treated as a C++ one
printf( " a C++ program\n__cplusplus expands to \ ""
TO_LITERAL(__cplusplus) " \ " \n " );
#endif
( void )getchar();
return 0 ;
}
int main() {
#define TO_LITERAL(text) TO_LITERAL_(text)
#define TO_LITERAL_(text) #text
#ifndef __cplusplus
/* this translation unit is being treated as a C one */
printf( " a C program\n " );
#else
// this translation unit is being treated as a C++ one
printf( " a C++ program\n__cplusplus expands to \ ""
TO_LITERAL(__cplusplus) " \ " \n " );
#endif
( void )getchar();
return 0 ;
}
代码很简单:
如果没有定义__cplusplus, 那么当前源代码被当作C源代码处理。
如果定义了__cplusplus,那么当前源代码被当中C++源代码处理, 并且输出__cplusplus宏被展开后的字符串。