【发布时间】:2012-11-26 14:23:46
【问题描述】:
我需要在 C++ 项目中包含一些最初用 C 编写的标头。头文件中使用了restrict keyword,导致C++语法错误。
我正在寻找一个预处理器宏来检查我是否使用 C++ 编译器进行编译,并在这种情况下删除 restrict 关键字。
【问题讨论】:
标签: c++ macros c-preprocessor
我需要在 C++ 项目中包含一些最初用 C 编写的标头。头文件中使用了restrict keyword,导致C++语法错误。
我正在寻找一个预处理器宏来检查我是否使用 C++ 编译器进行编译,并在这种情况下删除 restrict 关键字。
【问题讨论】:
标签: c++ macros c-preprocessor
#ifdef __cplusplus
#define restrict
#endif
应该这样做。 restrict 不是 C++ 中的关键字,因此 #define 将其删除是没有问题的。
或者,正如Arne Mertz 建议的那样,最好有
extern "C" {
#define restrict
// include C headers here
#undef restrict
}
在 C++ 源代码中包含 C 标头的位置。
【讨论】:
restrict 定义为nothing 即使在C 中也是合法的(因为预处理器会在C 编译器看到它之前转换源),但这不是预期的。
#define 放入 C++ 代码中(连同您将需要的 extern "C" {),您甚至不需要 #ifdef/#endif。尽量减少侵入,这意味着不要修改您的 C 代码,因为有人可能会尝试在 C++ 中使用该库。改为修改 C++ 代码。
#defineing 关键字是不允许的,但似乎这只是一个编码标准,而不是语言标准。
new 和 delete 定义为复杂的表达式,以帮助跟踪每个内存分配的来源。
restrict 定义和 extern "C" 块。这样做的好处是您需要在一个位置处理对 C++ 的支持。如果您无法控制该库,则需要外部(即围绕 #include)宏——但请注意,这需要在包含标头的所有 TU 中始终如一地完成