我正在尝试找到一个标准宏来测试头文件是被编译为 C 还是 C++。这样做的目的是标头可以包含在 C 或 C++ 代码中,并且必须根据具体情况略有不同。具体来说:
在 C 中,我需要这是代码:
extern size_t insert (const char*);
在 C++ 中,我需要将其作为代码:
extern "C" size_t insert (const char*);
此外,有没有办法避免在标题中的每个声明周围放置#ifdef?
我正在尝试找到一个标准宏来测试头文件是被编译为 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
允许在to块extern
内的各个函数前面包含。EXTERN_C_BEGIN
EXTERN_C_END