У меня есть следующее объявление:
#define ERROR 0x01
..
UINT32 res=ERROR;
Возможно ли, учитывая только переменную res
, скопировать строку "ERROR"
в массив символов?
РАЗРЕШЕНИЕ:
Возможно, я был недостаточно ясен. Я вызываю DLL, которая возвращает значения. Эти значения можно интерпретировать следующим образом:
switch (res)
{
case ERROR:
strcpy(arr, "ERROR");break;
case ...
}
так как есть много вариантов, и switch
будет огромным, я блуждал, возможно, есть ярлык...
#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);
Вы хотите отобразить имя определения? Это невозможно. Возможно, вы ищете что-то вроде:
myString=(res==ERROR)?"ERROR":"OK"
Это невозможно сделать без зависимости от имени 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);
линий.