有副作用的初始化器

Initializer with side-effect

C18 标准在 6.7.9/2 中声明:

No initializer shall attempt to provide a value for an object not contained within the entity being initialized.

不是很清楚是什么意思。有一个相关的话题:。我引用的子句用于解释以下初始化产生的错误:

//error: excess elements in array initializer char a[5]
char a[5] = {'h','e','l','l','o','[=10=]'}; 

其中 initializer-list 的长度超过了正在初始化的数组的大小。

但考虑 more trivial example:

int main(void){
    int a;
    int b = (a = 3);
}

这里的初始化器是(a = 3),它是一个assignment-expression。并且初始化程序将一个值分配给另一个应该导致约束违反的对象。

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

那不是 "providing a value for a"。这是一个具有在 a 中存储值的副作用的表达式。 "Providing a value"应该在初始化的上下文中理解;它不是用于作业的措辞。

标准中的语言试图达到的目的的一个不那么简单的例子可能是:

struct {
    char a[4];
    char b[4];
} foo = { { 'h', 'e', 'l', 'l', 'o' } };

鉴于(我认为;如果我错了请纠正我)以下是有效的,尽管令人困惑,C:

struct {
    char a[4];
    char b[4];
} foo = { 'h', 'e', 'l', 'l', 'o' };