如何检测C代码(需要“外部C”)是否用C ++编译

ffe*_*rri 46 c c++ extern

我有一个C标头作为C ++库的一部分。

此C标头仅由C编译器或extern "C" { ... }块内的C ++编译器编译才有意义,否则将发生未解决的链接错误。

我想添加一个块,例如:

#ifdef __cplusplus
#error "Compiling C bindings with C++ (forgot 'extern \"C\"'?)"
#endif
Run Code Online (Sandbox Code Playgroud)

在C标头中,但不幸的__cplusplus是,宏也是在一个extern "C" { ... }块中定义的。

还有另一种方法可以正确检测这种情况吗?

Sto*_*ica 101

通常的做法不是要求客户端代码在中包装标头extern "C",而是自己有条件地这样做。例如:

#ifdef __cplusplus
extern "C" {
#endif

  // Header content

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

这样,客户端代码将自动正确,而无需执行任何操作(包括标头)。

  • @ Rakete1111-我们不应该从没有`restrict`限定词的玻璃屋扔石头:P (17认同)
  • @pmg-不是在C ++中。如果嵌套语言链接规范,则最里面的“获胜”。该宏仅用于防止C编译器正确拒绝`extern“ C”`。 (14认同)
  • @SeñorCMasMas-它还告诉它遵守C调用约定(可能有所不同)。所要指出的是,如果C编译器不直接拒绝语法,而是将其视为no-op,那就太好了。因此,将不需要宏业务。 (12认同)