我总是使用const
来保护不应分配的值。无论如何,在某些情况下,我可能需要初始化变量,然后在同一函数中将其用作const
值。例如:
void foo() {
int flags;
/* ... */
if (condition1)
flags |= 1;
/* .... */
if (conditionX)
flags |= Y;
/* .... */
// start using flags as a const value
const flags; // <<= I want something like this.
const int c_flags = flags; // <<= What I have to do. The naming is annoying.
/* ... */
}
有没有办法改善这个?可以是编码样式或高级语言功能。
来自@Potatoswatter:对于gcc / clang中的C(gnu样式,比方说,-std = gnu11),可以使用Statement Expression。
foo() {
const int flags = ({
int f = 0;
if (X) f |= Y;
/* ... update f ... */
f;
});
/* use the `const` flags */
}
答案 0 :(得分:8)
考虑创建一个返回所需值的函数
1
或者更多面向对象创建一个在构造函数中执行该操作的标志类。
sdeclined
答案 1 :(得分:8)
在C ++中,您可以通过调用lambda表达式来初始化变量:
const int flags = [&] {
int flags = 0;
if (condition1)
flags |= 1;
....
if (conditionX)
flags |= Y;
return flags;
}();
在任何一种语言中,GCC和Clang(以及其他与GCC兼容的编译器)都具有与extension类似的功能:
const int flags = ({
int flags = 0;
if (condition1)
flags |= 1;
....
if (conditionX)
flags |= Y;
flags;
});
答案 2 :(得分:2)
您可以将变量的初始化委托给函数,并将其返回值分配给您需要的const
版本。例如:
int bar() {
int flags = 0;
if (condition1) {
flags |= 1;
}
// ...
return flags;
}
void foo() {
int const c_flags = bar();
// ...
}
这假设您可以将condition1
,...,conditionX
嵌入bar
。如果不是,您可以始终使用仿函数(lambdas)来测试谓词并相应地更新flags
。
答案 3 :(得分:1)
IMO这是一个编码风格问题。
int get_flags() {
int flags;
....
if (condition1)
flags |= 1;
....
if (conditionX)
flags |= Y;
....
return flags;
}
void foo() {
const int flags = get_flags();
....
}
答案 4 :(得分:0)
这听起来像是一个非问题......但如果它是一个实际问题,那么正确的程序设计可以很容易地解决它:
void foo() {
int flags;
flags = do_stuff_with(flags);
take_decisions_based_on(flags);
}
其中的功能类似于:
int do_stuff_with (int something);
void take_decisions_based_on (int something);
您甚至不需要应用const正确性,因为函数只处理变量的本地副本。
答案 5 :(得分:0)
使用三元运算符怎么样:
const int flags = condition1 ? 1 : (condition2 ? 2 : (conditionX ? Y : default_value))