具有副作用的初始化器

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。并且初始化程序为另一个对象分配一个值,这将导致违反约束。

为什么不打印任何诊断信息?

R..*_*R.. 5

那不是“为”提供价值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)

  • 是的,后者也是有效的。诸如`{{'h','e','l','l'},'o'};之类的丑陋事物也是如此; (3认同)