簡體   English   中英

C ++將#define復制到char數組

[英]C++ copy #define to char array

我有以下聲明:

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

僅給出變量res ,是否可以將字符串"ERROR"復制到char數組中?

澄清

也許我還不夠清楚。 我正在調用返回值的DLL。 這些值可以這樣解釋:

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

由於有很多選擇並且switch很大,我徘徊了也許有捷徑...

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

不依靠名稱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); 線。

您是否要顯示定義的名稱? 這是不可能的。 也許您正在尋找類似的東西:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM