有副作用的初始化器
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' };
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' };