我正在使用Code :: Blocks 10.05和mingw。似乎编译器没有识别限制限定符并在'src'之前返回“error:expected';',','或')'。我是否需要传递任何编译器选项才能正确编译?
int inet_pton4 (const char *restrict src, unsigned char *restrict dst)
p / s:看来mingw不支持inet_pton4,所以我尝试将开源版本集成到我的代码中。
答案 0 :(得分:7)
如果您的编译器不支持restrict
关键字,只需将该关键字取出(a)。
它用于向编译器指示您(开发人员)承诺指针遵循涉及别名的某些属性,这反过来允许编译器执行某些优化,否则这些优化不一定是安全的。
如果在支持它的编译器中省略该关键字,则会阻止这些优化(略微下降)。
如果你为不支持该关键字的编译器留下它,那么缺点是零(因为它们不支持这些优化)并且上升空间很大,如“它将为你编译“: - )
(a)您可能希望确保首先在C99模式下进行编译。虽然可能确实是您正在使用不理解gcc
的旧版restrict
,但您可能无法在C99模式下进行编译,例如使用-std=c99
(gcc
文档似乎表明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
解决方案可能对其他人有用。)