动态变量上的c ++ MACRO未声明标识符

时间:2014-02-26 13:49:18

标签: c++ imacros

我尝试在c ++中使用循环中的计数器变量构建动态字符串,我正在考虑简单的macro

类似这样的事情:

// its enum element string LOCAL_1, LOCAL_2 .....
    #define CREATE_STR(N) LOCAL_##N

    int ii =1;
        for(;ii<=COLS_NUMBERS_PER_WINDOW;)
        {
                     pGameObj->IniGameObj(pMainWindowObjCenter,
                                        CREATE_STR(ii),
                                        Z,                                   
                                        ii);
            GameVector.push_back(pGameObj);
            ii++;
        }

但是它给了我编译器错误

error C2065: 'LOCAL_ii' : undeclared identifier

还有其他好方法可以从动态变量构建动态字符串吗?我可以使用c ++ 11。

更新
我想我只需要这个:
Enum C++ Get by Index

2 个答案:

答案 0 :(得分:4)

很难说出你想要做什么。但我猜你有类似enum { LOCAL_1, LOCAL_2, ...的内容,并且想要将ii转换为这些符号。

你绝对不能用预处理器做到这一点。 ii的值在编译时甚至都不知道,并且因为预处理器甚至在此之前发生,所以你能做的最好的是简单的文本替换,这使得不可能使用ii作为改变表达你想要的。

你必须在运行时进行扩展,比如@ Jarod42建议("LOCAL_" + std::to_string(ii)),但是你留下了一个字符串。在运行时,编译器已经忘记了LOCAL_1等符号。

回到方阵1,如何将ii转换为LOCAL_xx?我建议如下:

如果LOCAL_xx是枚举,则只需将枚举常量指定给要从ii转换的值。

enum {
    LOCAL_1 = 1,
    LOCAL_2 = 2,
};

现在,iiLOCAL_xxx之间基本没有区别。不需要转换。

如果LOCAL_xx不是整数常量,那么您需要自己构建映射。例如,使用std::map<int, LOCAL_xxx>或大转换语句。

答案 1 :(得分:0)

您可以使用类似

的内容
const GameObjectTypeLocation locals[COLS_NUMBERS_PER_WINDOW] = {
    LOCAL_1, LOCAL_2, LOCAL_3
};
for (int ii = 1; ii <= COLS_NUMBERS_PER_WINDOW; ++ii)
{
    pGameObj->IniGameObj(pMainWindowObjCenter, locals[ii - 1], Z, ii);
    GameVector.push_back(pGameObj);
}

如果LOCAL_1LOCAL_2遵循逻辑,您可以直接将int转换为enum

for (int ii = 1; ii <= COLS_NUMBERS_PER_WINDOW; ++ii)
{
    // Assuming LOCAL_1 = 0, LOCAL_2 = 1, ...
    pGameObj->IniGameObj(pMainWindowObjCenter, GameObjectTypeLocation(ii - 1), Z, ii);
    GameVector.push_back(pGameObj);
}

作为说明,附:

enum GameObjectTypeLocation { LOCAL_1, LOCAL_2};

LOCAL_10LOCAL_21,..