使用宏在使用C++编译时去除`restrict`关键字

9

我需要在C++项目中包含一些原本用C语言编写的头文件。在这些头文件中,使用了restrict关键字,这导致在C++中出现了语法错误。

我正在寻找一个预处理宏,用于检查是否正在使用C++编译器,并在这种情况下删除restrict关键字。

1个回答

12
#ifdef __cplusplus
#define restrict
#endif

应该这样做。restrict不是C++中的关键字,因此在那里将其定义为空是没有问题的。

或者,正如Arne Mertz建议的那样,最好是有:

extern "C" {
#define restrict
// include C headers here
#undef restrict
}

在 C++ 源代码中包含 C 标头的位置。


1
即使在C中定义restrict为空也是合法的(因为预处理器在C编译器之前转换源代码),但这并不是原意所在。 - Alexey Feldgendler
3
如果您在包括C头文件之前将#define放入C++代码中(与您需要的extern "C" {一起),则甚至不需要使用#ifdef/#endif。尽量减少干扰,这意味着不要修改您的C代码,因为有人可能会尝试在C++中使用该库。而是修改C++代码。 - Arne Mertz
@AlexeyFeldgendler 你是对的。我以为#define关键字是不允许的,但似乎那只是一种编码标准,而不是语言标准。 - Daniel Fischer
3
@ArneMertz:双方的方法都有价值。如果C库在您的控制下,则可能希望改进它以具有C ++兼容接口,这意味着添加空的restrict定义和extern "C"块。优点是您只需要在一个位置处理对C ++的支持。如果您无法控制库,则需要使用外部(即在#include周围)的宏 - 但请注意,这需要在所有包含该头文件的TU中一致地完成。 - David Rodríguez - dribeas
另一个需要考虑的问题是,对于库中每个头文件<foo.h>,您通常会在C++中包含它,现在需要添加一个<cfoo>,它只需执行 extern "C" { #define restrict ... },然后在C++中包含该文件。 - Rob K
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接