Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们能用extern吗;";在没有#ifdef u cplusplus的C文件中?_C++_C_Extern C - Fatal编程技术网

C++ 我们能用extern吗;";在没有#ifdef u cplusplus的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

为什么不为需要定义为C函数的函数指定
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++的构造。