字符串初始化的 gcc 诊断不一致

2024-04-30

我正在使用 gcc 4.9.1/Mingw 并使用以下命令编译代码:

gcc test.c -otest.exe -std=c11 -迂腐错误 -Wall -Wextra

此代码给出诊断:

int main (void)
{
  char a[5] = {'h','e','l','l','o','\0'};
}

错误:数组初始值设定项 char a[5] 中元素过多

但是,此代码不会产生警告:

int main (void)
{
  char b[5] = "hello";
}

我认为这两种形式是 100% 等效的。 C 标准等中是否有任何理由或微妙之处,为什么后者不应该发出警告?

或者这是一个编译器错误?我知道 C 标准允许多余的初始化程序,与 C++ 不同,所以正式地我不相信 gcc 是required进行诊断。但我希望编译器能够一致地发出警告。


While:

 char a[5] = {'h','e','l','l','o','\0'};

是无效的。

(C11,6.7.9p2)“初始化程序不得尝试为未包含在正在初始化的实体中的对象提供值。”

This:

char b[5] = "hello";

C 明确允许(强调我的):

(C11, 6.7.9p14) “字符类型数组可以由字符串文字或 UTF-8 字符串文字初始化,可以选择用大括号括起来。字符串文字的连续字节 (如果有空间,则包括终止空字符或者如果数组大小未知)初始化数组的元素。”

But

 char b[5] = "hello!";

是无效的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串初始化的 gcc 诊断不一致 的相关文章

随机推荐