用C++编译时删除`restrict`关键字的宏

cls*_*udt 7 c++ macros c-preprocessor

我需要在C++项目中包含一些最初用C编写的头文件.在头文件中,使用restrict关键字,这导致C++的语法错误.

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

Dan*_*her 10

#ifdef __cplusplus
#define restrict
#endif
Run Code Online (Sandbox Code Playgroud)

应该这样做.restrict在C++中不是一个关键字,所以#define在那里没有问题是没有问题的.

或者,正如Arne Mertz建议的那样,更好的是

extern "C" {
#define restrict
// include C headers here
#undef restrict
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果在包含C头文件之前将`#define`放在C++代码中(与`extern'一起使用C` {`你将需要),你甚至不需要`#ifdef/#endif`.尝试微创,这意味着不要修改你的C代码,因为有人可能会尝试在C++中使用lib.改为修改C++代码. (3认同)
  • @ArneMertz:两种方法都有价值.如果C库在您的控制之下,那么您可能希望*改进它以使其具有C++兼容接口,这意味着添加空的`restrict`定义和`extern"C"`块.优点是您需要在单个位置处理对C++的支持.如果你不拥有控制权的图书馆,然后在外部(即周围的`#include`)需要宏 - 但注意,这将需要在所有的TU包括头始终做 (3认同)