我们可以在没有#ifdef __cplusplus的C文件中使用extern"C"吗?

Ale*_*der 8 c c++ extern-c

为什么不extern "C"应该为需要定义为C函数的函数指定?将文件编译为C源时,对编译器有什么影响?

如果对C编译器没有影响,我们不能通过删除#ifdef __cplusplus检查来在头文件中定义一个函数,如下所示吗?

extern "C" {
    int MyFunc();
}
Run Code Online (Sandbox Code Playgroud)

另一个问题的答案#ifdef需要,但我不明白为什么:

关于#2:将为正在通过C++编译器运行的任何编译单元定义__cplusplus.通常,这意味着.cpp文件和该.cpp文件包含的任何文件.如果不同的编译单元包含它们,则相同的.h(或.hh或.hpp或what-have-you)可以在不同的时间被解释为C或C++.如果您希望.h文件中的原型引用C符号名称,那么它们extern "C"在被解释为C++时必须具有,并且extern "C"在被解释为C时它们不应该具有- 因此#ifdef __cplusplus检查.

Lin*_*cer 18

该构造extern "C"是C++构造,并且不被C编译器识别.通常,它会发出语法错误消息.

一个常见的技巧是定义一个宏,例如EXTERN_C,根据你是否使用C或C++编译,它将扩展为不同的东西.例如:

在一个公共头文件中:

#ifdef __cplusplus
#define EXTERN_C extern "C" {
#define EXTERN_C_END }
#else
#define EXTERN_C
#define EXTERN_C_END
#endif
Run Code Online (Sandbox Code Playgroud)

在其他文件中:

EXTERN_C
int MyFunc(void);
EXTERN_C_END
Run Code Online (Sandbox Code Playgroud)