当使用G ++(例如Linux上的4.5版本)时,任何人都可以解释如果用户为这样的混合C / C ++系统编写头文件会发生什么/可能发生的事情:
#ifdef __cplusplus
extern "C" {
int myCPPfunc(some_arg_list....); /* a C++ function */
}
#endif
但是这里myCPPfunc()
是一个普通的C ++函数,里面有一个类def - 即它被错误地标记为C函数。
这有什么影响?
答案 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可调用函数。