【发布时间】:2015-09-26 14:28:36
【问题描述】:
我正在使用 gcc 4.9.1/Mingw 并使用以下代码编译代码:
gcc test.c -otest.exe -std=c11 -pedantic-errors -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 是 需要 来进行诊断的。但我希望编译器能始终如一地发出警告。
【问题讨论】:
-
这个问题类似于假设的重复,但我很好奇不一致警告的具体情况,假设重复的答案都没有解决。我相信我在这里也收到了一些更好的答案。重新开放。 (随意关闭另一个作为这个的副本,我不会干预它,因为我是部分的:))
-
"我知道 C 标准允许多余的初始化程序,不像 C++" -- 你这是什么意思?正如对重复问题的回答所说,C 明确允许对象的确切长度的字符串文字; C++ 没有。 C 通常不允许过多的初始化程序;
int arr[2] = { 1, 2, 3, 4 };在两种语言中都是非法的。 -
警告并不一致。 C 对字符串文字有一个特定的特殊情况规则;对于花括号初始化器,它没有这样的规则。在
char b[5] = "hello";中,初始化程序没有为b[5]提供值。 -
@KeithThompson 我相信这确实是 gcc 在这两种情况下表现不同的原因。 Ouah 引用了涵盖这两种情况的相关部分。
标签: c gcc initializer-list