有没有办法警告指定的初始化程序错误?

乔纳森·米

C99引入了结构的指定初始化器的概念。因此,例如,给定:

typedef struct {
    int c;
    char a;
    float b;
} X;

我可以像这样初始化:X foo = {.a = '\1', .b = 2.0F, .c = 4};并调用:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);将输出:

c = 4
a = 1
b = 2.000000

这里提到这有分配给的“令人惊讶的行为” c,然后ab独立我指定的初始的顺序。

如果我具有以下功能,这将成为一个真正的问题:

int i = 0;

int f() {
    return ++i;
}

int g() {
    i += 2;
    return i;
}

int h() {
    i += 4;
    return i;
}

我想这样初始化:X foo = {.a = (char)f(), .b = g(), .c = h()};现在,当我这样做时:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);我得到:

c = 4
a = 5
b = 7.000000

问题是没有警告我的初始化顺序未得到遵守。是否有警告或我可以启用的功能?

[现场示例]

雷克

...没有警告我的初始化顺序未得到遵守

特定的初始化顺序是基于标准中规定以外的期望。(如评论中指出)

C99第6.7.9节,第23页:23对初始化列表表达式的求值是不确定地相互关联的,因此未指定发生任何副作用的顺序[强调我的]

因此,除了未定义(或未指定)行为外,这里没有问题与其他C行为非常相似,例如函数参数的求值顺序不明确。

EDIT
C99可以这样说:

从C99§6.5.2.2p10起:
未指定函数自变量的求值顺序,未指定函数指定,实际自变量和实际自变量内的子表达式的求值顺序,但在实际调用之前有一个序列点。
[强调我的]

在这里阅读更多

您更喜欢警告(您说得好,+ 1)是另一回事。不确定在C / C ++语言中为-每个-未定义--行为提供警告会多么实用

有趣的是,在此讨论中,一些陈述的假设/观点为何C ++标准不包括指定的初始化程序。(还)...

... C ++更感兴趣的是将灵活性放在类型设计者的一边,因此设计者可以使正确使用类型的操作变得容易,而错误使用则更加困难。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法警告Chisel3中错误的时钟域交叉?

使用对象初始化程序时,有没有办法初始化私有类成员?

有没有办法初始化保留初始HTML的Vue对象

有没有办法为C ++范围循环选择条件选择不同的初始化程序列表?

有没有办法在声明时用缓冲区初始化数组?

有没有办法不触发Variable <T>的初始化值?

有没有办法只初始化一次阵列?

有没有办法初始化变量数组中的新列表

有没有办法抑制角度条件下子组件的初始化?

有没有办法判断是否已初始化惰性变量?

有没有办法初始化一个空切片?

有没有办法初始化大括号中的成员?

有没有办法强制对std :: array进行完全初始化

有没有办法不必两次初始化数组?

有没有办法初始化PHPUnit Test类模板?

有没有办法预测未初始化变量的值?

有没有办法在 C++17 中折叠初始化列表

有没有办法在 Stata 中初始化 3D 矩阵?

有没有办法从数组和整数值初始化元素列表?

在C ++ 11及更高版本中,有没有办法在初始化列表中初始化向量?

有没有办法避免在初始化字符串时从clang-tidy(fuchsia-default-arguments)发出此警告?

Angular-有没有办法推迟服务实例化,直到应用程序被异步初始化?

如何清除现有模型,或者有没有办法重新初始化摩纳哥编辑器

有没有办法手动初始化JSM序列化器?

有没有办法在特定的构造函数中延迟初始化一个昂贵的字段?

有没有办法初始化不涉及编写构造函数的新结构变量?

有没有办法从嵌套字典初始化协议缓冲区?(在 Python 中)

有没有办法禁用 Office.js 中的初始化计时器?

有没有办法获得在 Rust 中初始化值的位置和文件名?