有没有更好的方法在赋值后将变量强制转换为'const'?

时间:2016-10-12 06:18:32

标签: c++ c

我总是使用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 */
}

6 个答案:

答案 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))