使用外部“C”{对使用g ++时的C ++代码的影响

时间:2012-04-17 18:47:06

标签: c++ c g++ gnu

当使用G ++(例如Linux上的4.5版本)时,任何人都可以解释如果用户为这样的混合C / C ++系统编写头文件会发生什么/可能发生的事情:

#ifdef __cplusplus 

extern "C" {

int myCPPfunc(some_arg_list....); /* a C++ function */

}
#endif

但是这里myCPPfunc()是一个普通的C ++函数,里面有一个类def - 即它被错误地标记为C函数。

这有什么影响?

4 个答案:

答案 0 :(得分:1)

这样做的主要影响是你不能超载它,例如这是合法的:

int myCPPfunc(int a);
int myCPPfunc(char a);

但这不是:

extern "C"
{
    int myCPPfunc(int a);
    int myCPPfunc(char a);
}

答案 1 :(得分:1)

extern "C"函数的实现使用任意C ++功能是完全合法的。你不能做的是让它的接口成为你在C中无法做到的事情,例如:参数重载,方法(虚拟或其他),模板等

请注意,很多“你在C中无法做的事情”会引发未定义的行为而不是提示编译错误。

答案 2 :(得分:1)

这告诉C ++编译器头文件中声明的函数是C函数。

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.2

答案 3 :(得分:0)

这正是extern "C"的用途 - 它允许你编写一个可以从C调用的C ++函数。

本质上,该声明告诉C ++编译器您希望C ++函数myCPPfunc()具有可从C链接(因此可调用)的外部接口。

该函数的实现仍然是C ++,仍然可以使用C ++特性。

通常,头文件中函数的声明可能看起来更像:

#ifdef __cplusplus 
extern "C" {
#endif

int myCPPfunc(some_arg_list....); /* a C++ function */

#ifdef __cplusplus 
}
#endif

这使得C ++编译器或C编译器可以使用相同的头文件,并且每个头文件都会将其视为声明C可调用函数。