C18标准在6.7.9/2
处指出:
初始化程序不能为未包含在正在初始化的实体中的对象提供值。
这个意思并不是很清楚。这里有一个相关的话题:字符串初始化的不一致gcc诊断。我引用的条款被用来解释以下初始化产生的错误:
//error: excess elements in array initializer char a[5]
char a[5] = {'h','e','l','l','o','\0'};
当初始化列表的长度超过正在初始化的数组的大小时。
但是请考虑一个更简单的例子:
int main(void){
int a;
int b = (a = 3);
}
这里的初始化程序是
(a = 3)
,它是一个赋值表达式
。该初始化程序将一个值分配给另一个对象,这应该会引起约束违规。为什么没有打印任何诊断信息呢?
{ { 'h', 'e', 'l', 'l' }, 'o' }
这样的丑陋写法也是可以的。 - Antti Haapala -- Слава Україні{
和}
的能力,如果initializer-list
只包含一个元素,是吗? - St.Antario6.7.9/20
: 仅使用列表中足够的初始化器来对子聚合或包含联合体的第一个成员进行初始化;任何剩余的初始化器则留给初始化当前子聚合或包含联合体所属的聚合的下一个元素或成员。这是你使用的吗? - St.Antariostruct str{ char a[4]; char b[4]; char c[4]; char d[4]};
。应用6.7.9/20
,我期望以下代码可以正常工作:struct str foo = { {'h', 'e'}, 'l', 'l', 'o', 'w', 'o', 'r', {'l', 'd'} };
,并且foo.c
将被初始化为(or\0\0
),但是却打印出了warning: braces around scalar initializer
警告信息。演示。 - St.Antarioint a[4] = { [5] = 3 };
。 - Eric Postpischil