我正在尝试找到一个标准的宏来测试头文件是编译为C还是C++.这样做的目的是标题可以包含在C或C++代码中,并且必须根据具体情况略有不同.特别:
在C中,我需要这个代码:
extern size_t insert (const char*);
Run Code Online (Sandbox Code Playgroud)
在C++中,我需要这个代码:
extern "C" size_t insert (const char*);
Run Code Online (Sandbox Code Playgroud)
另外,有没有办法避免在标题中的每个声明周围放置#ifdef?
Jim*_*ter 27
将C头文件括起来是正常的,因此可以在C++程序中使用它们.检查你的系统头文件,如stdio.h,你可能会看到:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
Col*_*lin 15
答案是使用宏__cplusplus.在这种情况下,最直接的方法是:
extern
#ifdef __cplusplus
"C"
#endif
size_t insert (const char*);
Run Code Online (Sandbox Code Playgroud)
该宏是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 */
Run Code Online (Sandbox Code Playgroud)
这在包含在项目中大多数位置的标准标题中最有用.对于单个函数,您可以编写:
EXTERN_C size_t insert(const char *name);
Run Code Online (Sandbox Code Playgroud)
对于一组函数,您可以编写:
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
Run Code Online (Sandbox Code Playgroud)
允许extern在EXTERN_C_BEGINto EXTERN_C_END块内包含各个功能.