我是否需要GCC中带有C11的-pedantic标志?
我目前正在使用我是否需要GCC中带有C11的-pedantic标志?,c,gcc,c11,C,Gcc,C11,我目前正在使用GCC-5.3在我的机器上运行linuxmint,因为C11是默认值 我开始为自己学习C只是为了好玩,当时GCC版本是4.8,如果我没记错的话 如果在以下程序中使用带有-pedantic标志的GCC-4.8,则可以采用任何方式: #include <stdio.h> #include <string.h> int main(void){ char *arr = "1234567890123456789012345678901234567890123
GCC-5.3
在我的机器上运行linuxmint
,因为C11
是默认值
我开始为自己学习C
只是为了好玩,当时GCC
版本是4.8
,如果我没记错的话
如果在以下程序中使用带有-pedantic
标志的GCC-4.8
,则可以采用任何方式:
#include <stdio.h>
#include <string.h>
int main(void){
char *arr = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
size_t length = strlen(arr);
printf("Length of Arr = %zu\n",length);
}
#include <stdio.h>
#include <string.h>
void f(void);
void f2(void);
int main(void){
f();
}
void f(void){
}
void f2(void){
return f();
}
如果我们看到这部分警告:
warning: string length ‘510’ is greater than the length ‘509’ ISO C90 compilers are required to support [-Woverlength-strings]
很明显,-pedantic
标志在这里是个问题,所以我决定不使用它,也像避免-ansi
一样避免它,因为新的(上一个)标准C11
现在,如果我用GCC-5.3
编译相同的程序:
gcc-5 -Wall -pedantic program.c -o program
该程序编译良好,没有任何警告
现在基于以下问题,如果我尝试编译以下程序:
#include <stdio.h>
#include <string.h>
int main(void){
char *arr = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
size_t length = strlen(arr);
printf("Length of Arr = %zu\n",length);
}
#include <stdio.h>
#include <string.h>
void f(void);
void f2(void);
int main(void){
f();
}
void f(void){
}
void f2(void){
return f();
}
我得到:
program.c: In function ‘f2’:
program.c:16:16: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]
return f();
^
但是没有´-学究气´的标志,编译得很好。这对我来说是个困惑
这告诉我,不知何故,我确实需要-pedantic
标志,但我并不生气
因此,我的问题是,我们是否需要使用
-pedantic
和C11
?错误消息末尾的[-Wpedantic]
表示警告是由-pedantic
编译器选项生成的。换句话说,-pedantic
已经启用。您不需要-pedantic
标志。几乎没有人需要-pedantic
标志
迂腐-过分关注次要细节和规则
-学究式的
警告可以忽略,实际上根据定义。该标志在编写跨平台代码时可能很有用,但仅此而已。如果您需要它,您就需要它。如果你没有,你就没有
gcc的-pedantic
选项告诉它严格执行您要求的C标准的规则。这会导致额外的警告消息(如果使用-pedantic errors
,则会出现致命错误)
问题是,您希望编译器警告您违反C标准要求的代码吗
如果您希望代码尽可能便于携带,请使用-pedantic
,并密切关注它告诉您的任何内容。如果您希望代码依赖于非标准功能,请不要使用-pedantic
——但这样做可能会导致代码无法使用不同的编译器和/或针对不同的目标系统进行编译
您遇到的特定消息是针对在C90和C11之间发生变化的内容。C11要求编译器在字符串文字中至少支持4095个字符;C90只需要509。(在实践中,对于gcc,实际的限制不是固定的,而是由编译时的可用内存施加的。标准中描述限制的方式并不是那么简单,但我不会深入讨论。)尽管如此,您很少需要那么长的字符串文字
C99添加了%zu
格式,用于打印size\u t
类型的值。如果您希望代码能够移植到C99之前的实现中,那么需要避免使用它;例如,您可以使用printf(“%lu\n”,(unsigned long)sizeof foo)
。实际上,大多数当前的实现都支持%zu
带有表达式的return
语句,即使是void
类型的表达式,在使用void
返回类型定义的函数中也是不允许的。这是你应该得到的警告(IMHO)
底线:如果您想严格执行C标准的规则,请使用
-pedantic
。如果你不想这样做,不要使用-pedantic
。(但请考虑使用代码< > PoaNotry<代码>至少偶尔删除任何真正的错误,除了你可能不关心的警告。 < P>原C C89/C90标准只要求编译器允许字符串文字长509字节。使用长度超过509字节的字符串编译成C90标准的代码不能最大限度地移植;符合标准的编译器可以拒绝该代码。这在实践中不太可能成为问题,但在理论上可能会发生
限制在C99中提高到4095字节(在C11中保持不变)。因此,您必须使用更长的字符串才能违反C99或C11的限制
默认情况下,GCC4.x编译器使用C90标准。默认情况下,GCC 5.x编译器使用C11标准。因此,当使用GCC 4.x下的-pedantic
编译时,不能最大限度地移植到C90的代码将生成警告,但不会使用GCC 5.x生成相同的警告,除非构造也不能移植到所有C11编译器,除非它也违反了其中一个C11编译时间限制
-pedantic
标志有它的用途。例如,昨天有人遇到了问题,因为他们正在使用:
void *p = malloc(sizeof(*p));
根据标准,这是格式错误的代码,但GCC(5.3.0经过专门测试,但其他5.x和4.x版本的行为相同)允许它,将
sizeof(*p)
解释为1
。这是不可移植到其他编译器的。使用-pedantic
报告问题;不使用-pedantic
不使用。-pedantic只是一个打开一大堆警告和错误的标志,如果您愿意,您可以使用它,但听起来好像您真的没有使用c11,否则它不会给您特定的警告
尝试:
这将使gcc-5之前的版本使用C11标准作为默认值,而不是gnu89
C的默认模式现在是-std=gnu11,而不是-std=gnu89
从
更详细地说:c11和gnu11之间的区别很微妙,我没有对c11做过太多的研究,但是在c99/gnu99中,gnu99是c11的超集,允许一些比较
gcc -std=c11 -Wall -pedantic program.c -o program