C++ 我们能用extern吗;";在没有#ifdef u cplusplus的C文件中?
为什么不为需要定义为C函数的函数指定C++ 我们能用extern吗;";在没有#ifdef u cplusplus的C文件中?,c++,c,extern-c,C++,C,Extern C,为什么不为需要定义为C函数的函数指定extern“C”?将文件编译为C源代码时,这会对编译器产生什么影响 如果对C编译器没有影响,我们是否可以通过删除\ifdef\uu cplusplus检查,在头文件中定义一个函数,如下所示 extern "C" { int MyFunc(); } 说需要#ifdef,但我不明白为什么: > 2:将对通过C++编译器运行的任何编译单元定义“y+cPLUS”。通常,这意味着.cpp文件和该.cpp文件包含的任何文件。如果不同的编译单元包含H(OR,H
extern“C”
?将文件编译为C源代码时,这会对编译器产生什么影响
如果对C编译器没有影响,我们是否可以通过删除\ifdef\uu cplusplus
检查,在头文件中定义一个函数,如下所示
extern "C" {
int MyFunc();
}
说需要#ifdef
,但我不明白为什么:
<关于P> > 2:将对通过C++编译器运行的任何编译单元定义“y+cPLUS”。通常,这意味着.cpp文件和该.cpp文件包含的任何文件。如果不同的编译单元包含H(OR,H.O.HPP或你有什么),它们可以在不同的时间被解释为C或C++。如果要将.h文件中的原型引用C符号名称,则它们必须具有<代码>外“C”< /代码>,当被解释为C++时,它们不应该有<代码>外部“C”< /> >被解释为C时——因此<代码>
<构造>代码>外部“C”/CODE >是C++构造,而不是C编译器所识别的。通常,它会发出语法错误消息
一个常见的技巧是定义一个宏,例如ExtEXC,它将扩展到不同的东西,这取决于你使用C或C++编译。例如:
在公共头文件中:#ifdef __cplusplus
#define EXTERN_C extern "C" {
#define EXTERN_C_END }
#else
#define EXTERN_C
#define EXTERN_C_END
#endif
在其他文件中:
EXTERN_C
int MyFunc(void);
EXTERN_C_END
如果将源文件编译为C,它将无法识别外部“C”,并且通常会导致编译错误
如果编译一个源文件为C++,它将识别代码>外部“C”<代码>,正确的名称将被链接。
因此,您只能使用它可靠地为C++编译的文件指定C符号名称。 <>如果你编译源为C和C++,或者你的接口是针对C和C++客户端的,你需要指定这种方式,以便你的客户端在链接时得到正确的符号(等等)。
相关:您可以编写C++代码>外部代码“C++”,用于C++翻译。我不知道这是C++的构造。