C ++ скопировать #define в массив символов

0

У меня есть следующее объявление:

#define ERROR   0x01
..
UINT32 res=ERROR;

Возможно ли, учитывая только переменную res, скопировать строку "ERROR" в массив символов?

РАЗРЕШЕНИЕ:

Возможно, я был недостаточно ясен. Я вызываю DLL, которая возвращает значения. Эти значения можно интерпретировать следующим образом:

switch (res)
{
    case ERROR:
     strcpy(arr, "ERROR");break;
    case ... 
}

так как есть много вариантов, и switch будет огромным, я блуждал, возможно, есть ярлык...

Теги:
char
c-preprocessor

3 ответа

0
Лучший ответ
#define ERROR   0x01

определяет постоянный интегральный литерал 0x01 а препроцессор включает следующую строку:

UINT32 res = ERROR;

в:

UINT32 res = 0x01;

перед началом компиляции. Нет массива символов.


Если вы хотите скопировать связанное имя константы, чтобы не делать что-то вроде:

case ERROR:
 strcpy(arr, "ERROR"); break;
case X:
 strcpy(arr, "X"); break;
case Y:
 strcpy(arr, "Y"); break;
...

то вы можете создать помощник со статической структурой, получая имя по заданному коду, но для безопасности типа я бы избегал #define как можно больше. Что-то вроде (это всего лишь концепция):

const char* getRetCodeName(const UINT32 code) {
    static std::map<int, const char*> codes;
    static int firstCall = 1;
    if (firstCall) {
        codes[ERROR] = "ERROR";
        codes[X] = "X";
        codes[Y] = "Y";
        firstCall = 0;
    }
    return codes[code];
}

и в коде вызывающего абонента:

UINT32 res = someCall();
const char* retCodeName = getRetCodeName(res);
0

Вы хотите отобразить имя определения? Это невозможно. Возможно, вы ищете что-то вроде:

myString=(res==ERROR)?"ERROR":"OK"
0

Это невозможно сделать без зависимости от имени ERROR, но вы можете сделать что-то вроде этого:

const char* value_to_string(UINT32 val) {
  #define CHECK_CONSTANT(maConst) \
    if (val == maConst) return #maConst

  CHECK_CONSTANT(ERROR);
  return 0;

  #undef CHECK_CONSTANT
}

Это абстрагируется от значения макроса, но, к сожалению, он не может абстрагироваться от своего имени. Если у вас есть несколько таких #define, вы также можете перечислить их все как последующие CHECK_CONSTANT(something); линий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню