如何编写可在C ++程序中使用的C头文件?

可能重复:
如何检查(通过预处理器)C源文件是否被编译为C ++代码

我正在尝试找到一个标准宏来测试头文件是编译为C还是C ++。 这样做的目的是标题可以包含在C或C ++代码中,并且必须根据具体情况略有不同。 特别:

在C中,我需要这个代码:

extern size_t insert (const char*); 

在C ++中,我需要这个代码:

 extern "C" size_t insert (const char*); 

另外,有没有办法避免在标题中的每个声明周围放置#ifdef?

将C头文件括起来是正常的,因此可以在C ++程序中使用它们。 检查你的系统头文件,如stdio.h,你可能会看到:

 #ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus } #endif 

答案是使用宏__cplusplus。 在这种情况下,最直接的方法是:

 extern #ifdef __cplusplus "C" #endif size_t insert (const char*); 

该宏是C ++标准的一部分。

您可能会发现定义三个宏来帮助解决这个问题是合理的:

 #ifdef __cplusplus #define EXTERN_C_BEGIN extern "C" { #define EXTERN_C_END } #define EXTERN_C extern "C" #else #define EXTERN_C_BEGIN /* Nothing */ #define EXTERN_C_END /* Nothing */ #define EXTERN_C extern /* Or Nothing */ #endif /* __cplusplus */ 

这在包含在项目中大多数位置的标准标题中最有用。 对于单个函数,您可以编写:

 EXTERN_C size_t insert(const char *name); 

对于一组函数,您可以编写:

 EXTERN_C_BEGIN size_t other_insert(const char *name); size_t other_delete(const char *name); size_t other_update(const char *old_name, const char *new_name); EXTERN_C_END 

允许在EXTERN_C_BEGINEXTERN_C_END块内的各个函数前面包含extern