【问题标题】:c++ MACRO undeclared identifier on dynamic variablec ++ MACRO动态变量上未声明的标识符
【发布时间】:2014-02-26 13:49:18
【问题描述】:

我尝试从 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

【问题讨论】:

  • 宏在“正常”编译之前运行,更不用说在运行时了。
  • 我希望这就是您所指的。 stackoverflow.com/questions/806543/…
  • @chris: 我得到 : 无法将参数 2 从 'std::basic_string<_elem>' 转换为 'GameObjectTypeLocation' 它的枚举类型

标签: c++ imacros


【解决方案1】:

很难说你想做什么。但我猜你有enum { LOCAL_1, LOCAL_2, ... 之类的东西,你想将ii 转换为这些符号。

你绝对不能用预处理器做到这一点。 ii 的值在编译时甚至是未知的,因为预处理器甚至在此之前发生,所以你能做的最好的事情就是简单的文本替换,这使得不可能像你想要的那样使用 ii 作为一个变化的表达式.

您必须在运行时进行扩展,就像 @Jarod42 建议的 ("LOCAL_" + std::to_string(ii)) 一样,但是您会得到一个字符串。在运行时,编译器已经忘记了像 LOCAL_1 这样的符号。

那么回到第一方,如何将ii 转换为LOCAL_xx?我建议如下:

如果LOCAL_xx 是一个枚举,那么只需将枚举常量分配给您要从ii 转换的值。

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

现在,iiLOCAL_xxx 基本没有区别。无需转换。

如果LOCAL_xx 不是整数常量,那么您需要自己构建映射。例如使用 std::map&lt;int, LOCAL_xxx&gt; 或大的 switch 语句。

【讨论】:

    【解决方案2】:

    你可以使用类似的东西

    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,..

    【讨论】:

    • 呵呵 好主意很简单,问题是我已经有了枚举,我没有复制数据的内容
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多