imacros — необъявленный идентификатор c ++ MACRO для динамической переменной

Я пытаюсь построить динамическую строку из переменной счетчика в цикле в 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 ++ Получить по индексу

1

Решение

Трудно сказать, что ты пытаешься сделать. Но я предполагаю, что у вас есть что-то вроде 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,
};

Теперь, в принципе нет разницы между ii а также LOCAL_xxx, Нет необходимости в конвертации.

Если LOCAL_xx не являются целочисленными константами, тогда вам нужно будет построить отображение самостоятельно. Например, используя std::map<int, LOCAL_xxx> или большое заявление переключателя.

4

Другие решения

Вы можете использовать что-то вроде

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_1, LOCAL_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_1 является 0, LOCAL_2 является 1..

0

По вопросам рекламы [email protected]