2

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

#ifdef __cplusplus 

extern "C" {

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

}
#endif

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

这有什么影响?

4

4 回答 4

1

The main impact of this is that you cannot overload it, e.g. this is legal:

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

But this is not:

extern "C"
{
    int myCPPfunc(int a);
    int myCPPfunc(char a);
}
于 2012-04-17T18:51:45.607 回答
1

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

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

于 2012-04-17T18:54:42.153 回答
1

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

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

于 2012-04-17T18:51:53.720 回答
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 可调用函数。

于 2012-04-17T19:32:17.170 回答