C ++将#define复制到char数组

时间:2013-10-16 09:58:16

标签: c++ c char c-preprocessor

我有以下声明:

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

只有变量res,是否可以将字符串"ERROR"复制到char数组中?

澄清

也许我不够清楚。 我正在调用一个返回值的DLL。 这些值可以这样解释:

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

因为有很多选项而且switch会很大,我徘徊可能有一条捷径......

3 个答案:

答案 0 :(得分:0)

#define ERROR   0x01

定义常量整数文字0x01,预处理器将转换以下行:

UINT32 res = ERROR;

成:

UINT32 res = 0x01;
在编译开始之前

。没有 char数组


如果您想复制常量的关联名称,以避免执行以下操作:

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);

答案 1 :(得分: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);行。

答案 2 :(得分:0)

您要显示定义的名称吗?这是不可能的。 也许你正在寻找类似的东西:

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