gpt4 book ai didi

c - 我需要 GCC 的 -pedantic 标志和 C11 吗?

转载 作者:太空狗 更新时间:2023-10-29 15:11:30 25 4
gpt4 key购买 nike

我目前正在使用 GCC-5.3 在我的机器上运行 Linux Mint,因为默认包含 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);
}

在编译时会收到以下警告:

program.c: In function ‘main’:
program.c:5:5: warning: string length ‘510’ is greater than the length ‘509’ ISO C90 compilers are required to support [-Woverlength-strings]
char *arr = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
^
program.c:7:5: warning: ISO C90 does not support the ‘z’ gnu_printf length modifier [-Wformat=]
printf("Length of Arr = %zu\n",length);
^
program.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

如果我们看到这部分警告:

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

程序编译正常,没有警告。

现在基于以下问题 Return void type in C and C++,如果我尝试编译以下程序:

#include <stdio.h>
#include <string.h>

void f(void);
void f2(void);

int main(void){
f();
}


void f(void){
}

void f2(void){
return f();
}

具有以下内容:

gcc-5 -Wall -pedantic program.c -o program

我得到:

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 标志,但我并不觉得痛。

所以,我的问题是,我们是否需要使用 -pedantic anymore C11

最佳答案

如果你需要它,你就需要它。如果你不这样做,你就不会。

gcc 的 -pedantic 选项告诉它严格执行您所请求的 C 标准的规则。这会导致额外的警告消息(如果您使用 -pedantic-errors,则会导致 fatal error )。

问题是,您是否希望编译器警告您有关违反 C 标准要求的代码?

如果您希望您的代码尽可能可移植,请使用 -pedantic 并密切注意它告诉您的任何内容。如果您希望您的代码依赖于非标准功能,请不要使用 -pedantic —— 但是您冒着您的代码可能无法使用不同的编译器和/或不同的编译器进行编译的风险目标系统。

您遇到的特定消息是关于 C90 和 C11 之间发生变化的内容。 C11 要求编译器在字符串文字中支持至少 4095 个字符; C90 只需要 509。(实际上,对于 gcc,实际限制不是固定的,而是在编译时由可用内存强加的。标准中描述限制的方式并不那么简单,但我不会深入那个。)不过,您很少需要那么长的字符串文字。

C99 添加了 %zu 格式来打印 size_t 类型的值。如果您希望您的代码可移植到 C99 之前的实现,则需要避免使用它;例如,您可以使用 printf("%lu\n", (unsigned long)sizeof foo)。实际上,大多数当前实现都支持 %zu

在用 void 返回类型定义的函数中,不允许带有表达式的 return 语句,即使是 void 类型的表达式.这是您应该想要的警告(恕我直言)。

底线:如果您想严格执行 C 标准的规则,请使用 -pedantic。如果您不想这样做,请不要使用 -pedantic。 (但是请考虑使用 -pedantic 至少偶尔编译您的代码以清除它检测到的任何实际错误,以及您可能不关心的警告。)

关于c - 我需要 GCC 的 -pedantic 标志和 C11 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com