我需要在C++项目中包含一些原本用C语言编写的头文件。在这些头文件中,使用了restrict
关键字,这导致在C++中出现了语法错误。
我正在寻找一个预处理宏,用于检查是否正在使用C++编译器,并在这种情况下删除restrict
关键字。
我需要在C++项目中包含一些原本用C语言编写的头文件。在这些头文件中,使用了restrict
关键字,这导致在C++中出现了语法错误。
我正在寻找一个预处理宏,用于检查是否正在使用C++编译器,并在这种情况下删除restrict
关键字。
#ifdef __cplusplus
#define restrict
#endif
应该这样做。restrict
不是C++中的关键字,因此在那里将其定义为空是没有问题的。
或者,正如Arne Mertz建议的那样,最好是有:
extern "C" {
#define restrict
// include C headers here
#undef restrict
}
在 C++ 源代码中包含 C 标头的位置。
restrict
为空也是合法的(因为预处理器在C编译器之前转换源代码),但这并不是原意所在。 - Alexey Feldgendler#define
放入C++代码中(与您需要的extern "C" {
一起),则甚至不需要使用#ifdef/#endif
。尽量减少干扰,这意味着不要修改您的C代码,因为有人可能会尝试在C++中使用该库。而是修改C++代码。 - Arne Mertz#define
关键字是不允许的,但似乎那只是一种编码标准,而不是语言标准。 - Daniel Fischerrestrict
定义和extern "C"
块。优点是您只需要在一个位置处理对C ++的支持。如果您无法控制库,则需要使用外部(即在#include
周围)的宏 - 但请注意,这需要在所有包含该头文件的TU中一致地完成。 - David Rodríguez - dribeas<foo.h>
,您通常会在C++中包含它,现在需要添加一个<cfoo>
,它只需执行extern "C" { #define restrict ... }
,然后在C++中包含该文件。 - Rob K