【问题标题】:C++ copy #define to char arrayC ++复制#define到char数组
【发布时间】:2013-10-16 09:58:16
【问题描述】:

我有以下声明:

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

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

澄清

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

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

因为有很多选择,switch 会很大,所以我徘徊着也许有一条捷径......

【问题讨论】:

  • 我不明白你想问什么...请举个例子,插图。
  • 在编译之前,有一个预处理程序,它接受你的带有预处理语句的程序,把它变成一个没有预处理语句的纯程序形式。因此,ERROR 在程序中的任何位置都被 0x01 替换,甚至在编译开始之前。如果您的程序是使用 gcc 编译的 C 程序:尝试 gcc -E file_name.c 以获取预处理输出。

标签: c++ c char c-preprocessor


【解决方案1】:
#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;
...

然后您可以创建一个具有静态结构的助手,通过给定的代码检索名称,但为了类型安全,我会尽可能避免#defines。类似的东西(这只是一个概念):

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

【讨论】:

    【解决方案2】:

    不依赖名称 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); 行。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多