我有以下声明:
#define ERROR 0x01
..
UINT32 res=ERROR;
只有变量res
,是否可以将字符串"ERROR"
复制到char数组中?
澄清:
也许我不够清楚。 我正在调用一个返回值的DLL。 这些值可以这样解释:
switch (res)
{
case ERROR:
strcpy(arr, "ERROR");break;
case ...
}
因为有很多选项而且switch
会很大,我徘徊可能有一条捷径......
答案 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"