【问题标题】:restrict qualifier compilation error限制限定符编译错误
【发布时间】:2011-10-31 05:30:30
【问题描述】:

我正在使用 Code::Blocks 10.05 和 mingw。似乎编译器无法识别限制限定符并在 'src' 之前返回“错误:预期的';'、',' 或 ')'”。是否需要传递任何编译器选项才能正确编译?

int inet_pton4 (const char *restrict src, unsigned char *restrict dst)

p/s:mingw 好像不支持inet_pton4,所以我尝试将开源版本集成到我的代码中。

【问题讨论】:

    标签: c mingw codeblocks


    【解决方案1】:

    如果您的编译器不支持restrict 关键字,只需将该关键字去掉(a)

    它用于向编译器表明您(开发人员)承诺指针遵循某些涉及别名的属性,而这反过来又允许编译器执行某些优化,否则这些优化不一定是安全的。

    如果您在支持它的编译器中省略该关键字,则会阻止这些优化(轻微的缺点)。

    如果您将它留给支持该关键字的编译器,则缺点是 nil(因为它们无论如何都不支持这些优化)并且优点是相当大的,如“它将为您编译”:-)


    (a) 您可能需要确保首先在 C99 模式下进行编译。虽然可能您使用的是不理解 restrict 的较旧的 gcc,但同样可能您没有在 C99 模式下编译,例如使用 -std=c99gcc 文档似乎表明 restrict 已被支持甚至回到版本 3.0)。

    如果由于某种原因您无法激活 C99 模式,我认为 gcc 有一个扩展程序允许您使用 __restrict

    【讨论】:

    • 取出关键字的简单方法(如有必要):在命令行上使用-Drestrict。预处理器会为您取出它,您无需编辑任何代码。如果您迁移到 C99 编译器,将来也可以轻松恢复。
    【解决方案2】:

    由于 restrict 是 C99 中的新内容,并且正如 @paxdiablo 指出的那样,省略 restrict 关键字并没有真正造成任何伤害,您可以这样做:

    #if __STDC_VERSION__ < 199901L
    #define restrict /* nothing */
    #endif
    

    将其放在项目中所有内容的 #included 标头中(或至少使用 restrict 的所有内容)。

    这应该让您的代码可以使用任何 C 编译器进行编译,无论它是否支持 C99。它甚至应该适用于没有定义 __STDC_VERSION__ 的编译器。

    但是,由于您使用的是使用 gcc 的 MinGW,因此使用 gcc --std=c99 也应该可以解决问题(正如 @paxdiablo 也指出的那样)。

    您可以安全地做到这两点。 (而且#if 解决方案可能对其他人有用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2011-03-08
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2010-09-29
      相关资源
      最近更新 更多