在声明变量之后,有没有办法证实变量?

时间:2011-01-14 10:02:58

标签: c++ c const

  

可能重复:
  Is there some ninja trick to make a variable constant after its declaration?

有时在C或C ++中我们有一个可能是const的变量,但是我们必须使用一些代码来初始化它。

有没有办法告诉编译器,从函数的某个角度来看,一些已构造的变量必须被视为const,直到其范围结束?

类似的东西:

int c = 0;
// the value of c is initialized here
switch(someVar) {
   case foo: c = 3; break;
   case bar: c = 4; break;
   default : c = 42; // what else?
}
// now c is constant
ASSUME_CONST_FROM_NOW(c) // some #pragma maybe?

我知道我可以在专用函数中初始化变量。这不是我要求的。

另一个例子:

int c = 0; int d = 0;
{ /*some block of code that initializes both c and d jointly*/ }
ASSUME_CONST_FROM_NOW(c, d)

没有可以在不创建结构或类的情况下一次返回两个值的函数。

但是这样一个技巧可能会有用,以便在没有太多重构的情况下使旧的,糟糕的代码更容易理解。

3 个答案:

答案 0 :(得分:9)

将初始化放在函数中。

int getInitCValue(int const& someVar)
{
    // the value of c is initialized here
    switch(someVar)
    {
        case foo: return 3;
        case bar: return 4;
        default : return 42; // what else?
    }
}

int const c = getInitCValue(someVar);

编辑:回答修改后的问题。

您想要初始化两个值:

std::pair<int,int> const value = initalizePairOfValues(someValue);
int const& c = value.first;
int const& d = value.second;

编辑2:使用PéterTörök删除解决方案(如果您取消删除,我会将其删除)。

struct ConstValues
{
    ConstValues()
    {
         switch(....)
         // Initialize C/D
    }
    int const& getC() const {return c;}
    int const& getD() const {return d;}
    private:
       int c;
       int d;
};

答案 1 :(得分:9)

在C ++ 0x中,您可以执行以下操作:

int const c = []() -> int { 
    int r; 
    switch(42) { 
    case 3: 
        r = 1; break; 
    case 4: 
        r = 2; break; 
    default: 
        r = 23; 
    }; 
    return r; 
}();

答案 2 :(得分:1)

如果您愿意在代码中提供一些{}来查看变量const,是的,至少有类似的东西。在宏中添加如下内容:

#define CONSTIFY(T, NAME)                  \
for (bool p00 = true; p00; p00=false)      \
for (T p000 = NAME; p00; p00=false)        \
for (T const NAME = p000; p00; p00=false)

这应该适用于C99和C ++。从技术上讲,这不会产生原始变量const,但会创建一个新的变量,其具有相同范围的相同内容。

请注意,在某些情况下(breakcontinue),这可能会改变控制流程。但是只要你将它包装在一个基本上是整个函数体的东西上面,这应该可行。