【问题标题】:Macro for removing the `restrict` keyword when compiling with C++使用 C++ 编译时删除 `restrict` 关键字的宏
【发布时间】:2012-11-26 14:23:46
【问题描述】:

我需要在 C++ 项目中包含一些最初用 C 编写的标头。头文件中使用了restrict keyword,导致C++语法错误。

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

【问题讨论】:

    标签: c++ macros c-preprocessor


    【解决方案1】:
    #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 编译器看到它之前转换源),但这不是预期的。
    • 如果在包含 C 标头之前将 #define 放入 C++ 代码中(连同您将需要的 extern "C" {),您甚至不需要 #ifdef/#endif。尽量减少侵入,这意味着不要修改您的 C 代码,因为有人可能会尝试在 C++ 中使用该库。改为修改 C++ 代码。
    • @AlexeyFeldgendler 你是对的。我以为#defineing 关键字是不允许的,但似乎这只是一个编码标准,而不是语言标准。
    • 事实上,有时这样做是有原因的。我见过例如new 和 delete 定义为复杂的表达式,以帮助跟踪每个内存分配的来源。
    • @ArneMertz:这两种方法都有其价值。如果 C 库在您的控制之下,那么您可能希望改进它以具有 C++ 兼容接口,这意味着添加空的 restrict 定义和 extern "C" 块。这样做的好处是您需要在一个位置处理对 C++ 的支持。如果您无法控制该库,则需要外部(即围绕 #include)宏——但请注意,这需要在包含标头的所有 TU 中始终如一地完成
    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多