gpt4 book ai didi

c - 为什么数组中的 char 在 gcc 中为 newlib 中的 isspace 给出下标警告

转载 作者:行者123 更新时间:2023-12-05 02:33:51 32 4
gpt4 key购买 nike

我无法理解代码中的编译器警告。我们的代码与本例中给出警告 (-Wchar-subscripts) 的代码类似。我们使用 ARM gcc 9.2.1 embedded 和 newlib 作为标准库。

#include <ctype.h>

int main ()
{
char str[]="Example string\n";

int i = isspace(str[1]); // Warning

char c=str[1];
i = isspace(c); // No warning

i = isspace((unsigned char)str[1]); // No warning
}

Example in godbolt

据我了解,isspace 的实现可以通过数组索引。因此警告。但在那种情况下,1 和 2 不应该都发出警告吗?为什么只有第一个发出警告?

我们通过添加强制转换解决了我们的代码,但在我理解它为什么有用之前我并不真正满意。

最佳答案

这似乎与 Bugzilla 此处讨论的错误完全相同 Bug 95177 - error: array subscript has type char .基本上 gcc 的诊断不一致,这种行为只出现在以后的版本中。

如该线程中所讨论的那样,将 char 传递给 ctype.h 函数理论上可能会出现问题,以防 char 包含任何未知内容。这些函数被定义为期望输入可以表示为 unsigned char,请参阅 C17 7.4:

In all cases the argument is an int, the value of which shall berepresentable as an unsigned char or shall equal the value of the macro EOF

因此 int i = isspace((unsigned char)str[1]); 使警告消失。

但是您可以看出警告是不一致的。这可能是因为当您使用 ctype.h 时,编译器有时会选择一个宏,有时会选择一个函数。

就禁用它,把它当成误报。根据上面的 Bugzilla 日志,这个问题最近应该已经修复了。 gcc (trunk) 和 gcc >10.3 不再给出此警告。

关于c - 为什么数组中的 char 在 gcc 中为 newlib 中的 isspace 给出下标警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70863167/

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