当前位置:  开发笔记 > 程序员 > 正文

是否有办法警告行为不端的指定初始化器?

如何解决《是否有办法警告行为不端的指定初始化器?》经验,为你挑选了1个好方法。

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

问题是没有警告我的初始化顺序没有得到遵守.是否有警告或我能为此启用的内容?

[ 实例 ]



1> 2501..:

你可以在C中做的最好的(读取:合理的)是在初始化struct之前声明三个临时的const变量.他们的声明顺序是他们的初始化者的评估顺序.

像这样的东西:

const char a = f();
const float b = g();
const int c = h();

X foo = {.a = a, .b = b, .c = c};

在这种情况下,函数调用的顺序和程序员的意图是清楚的.


我敢说*最好的事情是避免有副作用的初始化表达式.如果无法做到这一点,那么这种方法就构成了合理的便利.
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有