我是否需要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