簡體   English   中英

C ++ MACRO動態變量上未聲明的標識符

[英]c++ MACRO undeclared identifier on dynamic variable

我試圖從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。

更新:
我想我只需要這個:
枚舉C ++按索引獲取

很難說出您要做什么。 但是我猜測您有類似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>或大的switch語句。

您可以使用類似

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM