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

Col*_*lin 13 c c++ macros

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

我正在尝试找到一个标准的宏来测试头文件是编译为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 extern"C"{#endif` ...`#ifdef __cplusplus} #endif`. (4认同)
  • 另一种可能性:`#ifdef __cplusplus` ...`#define EXTERN extern"C"```#other` ...``#define EXTERN extern` ...`#endif`(where ...表示一个新队) (4认同)

Jon*_*ler 7

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

#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)

允许externEXTERN_C_BEGINto EXTERN_C_END块内包含各个功能.