限制限定符编译错误

时间:2011-10-31 05:30:31

标签: c mingw codeblocks

我正在使用Code :: Blocks 10.05和mingw。似乎编译器没有识别限制限定符并在'src'之前返回“error:expected';',','或')'。我是否需要传递任何编译器选项才能正确编译?

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

如果你为支持该关键字的编译器留下它,那么缺点是零(因为它们不支持这些优化)并且上升空间很大,如“它将为你编译“: - )


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

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

答案 1 :(得分:3)

由于restrict在C99中是新的,因为正如@paxdiablo指出的那样,省略restrict关键字并没有真正伤害任何东西,你可以这样做:

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

将此项放在项目中所有内容的#include标题中(或者至少使用restrict的所有内容)。

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

但是,因为你正在使用使用gcc的MinGW,使用gcc --std=c99也应该解决问题(正如@paxdiablo也指出的那样)。

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