0

我有以下声明:

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

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

澄清

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

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

由于有很多选择并且switch会很大,我徘徊也许有一条捷径......

4

3 回答 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尽可能避免使用 s 。类似的东西(这只是一个概念):

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);
于 2013-10-16T10:06:17.817 回答
0

不依赖于 name 是不可能做到这一点的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);行。

于 2013-10-16T10:06:32.677 回答
0

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

myString=(res==ERROR)?"ERROR":"OK"
于 2013-10-16T10:10:30.760 回答