C语言 具有副作用的初始值设定项



C18标准在6.7.9/2中指出:

任何初始值设定项都不得尝试为对象提供值 包含在正在初始化的实体中。

目前还不清楚这意味着什么。有一个相关的主题:用于字符串初始化的 gcc 诊断。我引用的子句用于解释以下初始化产生的错误:

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

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

但考虑更琐碎的例子:

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

这里的初始值设定项是(a = 3)这是一个assignment-expression。初始值设定项将一个值分配给另一个对象,该值应导致约束冲突。

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

这不是"为a提供价值"。这是一个表达式,具有在a中存储值的副作用。"提供值"应在初始化的上下文中理解;它不是用于作业的措辞。

标准中的语言试图达到的一个不太平凡的例子可能是:

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' };

最新更新