St.*_*rio 4 c initialization language-lawyer
C18标准指出6.7.9/2:
初始化程序不得尝试为未包含在正在初始化的实体中的对象提供值。
目前还不清楚这意味着什么。有一个相关主题:用于字符串初始化的Incretent gcc诊断。我引用的子句用于解释以下初始化产生的错误:
//error: excess elements in array initializer char a[5]
char a[5] = {'h','e','l','l','o','\0'};
Run Code Online (Sandbox Code Playgroud)
其中的initializer-list长度超过正在初始化的数组的大小。
但是考虑更简单的例子:
int main(void){
int a;
int b = (a = 3);
}
Run Code Online (Sandbox Code Playgroud)
这里的初始值设定项(a = 3)是assignment-expression。并且初始化程序为另一个对象分配一个值,这将导致违反约束。
为什么不打印任何诊断信息?
那不是“为”提供价值a。这是一个将值存储在中的副作用a。“提供值”应在初始化的上下文中理解;它不是用于作业的短语。
标准中的语言试图说明的一个较简单的例子可能是:
struct {
char a[4];
char b[4];
} foo = { { 'h', 'e', 'l', 'l', 'o' } };
Run Code Online (Sandbox Code Playgroud)
而(我认为;如果我错了,请纠正我)以下内容将是有效的,尽管令人困惑,C:
struct {
char a[4];
char b[4];
} foo = { 'h', 'e', 'l', 'l', 'o' };
Run Code Online (Sandbox Code Playgroud)