13

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

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

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

extern size_t insert (const char*);

在 C++ 中,我需要将其作为代码:

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

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

4

3 回答 3

27

通常将 C 头文件如下括起来,以便它们可以在 C++ 程序中使用。检查您的系统头文件,例如 stdio.h,您可能会看到:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif
于 2012-09-22T23:54:48.253 回答
15

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

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

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

于 2012-09-22T23:24:41.507 回答
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 */

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

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

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

于 2012-09-23T06:48:38.360 回答