2013-10-16 97 views
0

我有以下聲明:C++複製#定義字符數組

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

是否有可能,只給定變量res,字符串"ERROR"複製到一個字符數組?

澄清

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

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

,因爲有許多選項和switch將是巨大的,我徘徊也許有捷徑...

+0

我不明白你想問什麼......請舉一些例子,說明。 –

+0

在編譯之前,有一個預處理器程序,它接受帶有預處理語句的程序,將其轉化爲純粹的程序形式,而無需預處理語句。因此,即使在編譯開始之前,程序中的任何地方都會將'ERROR'替換爲'0x01'。如果你的程序是用gcc編譯的C程序:嘗試'gcc -E file_name.c'來獲得預處理輸出。 – smRaj

+0

可能的重複[是否有一個簡單的腳本來將C++枚舉轉換爲字符串?](http://stackoverflow.com/questions/201593/is-there-a-simple-script-to-convert-c-enum-to -string) – MSalters

回答

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。喜歡的東西(這僅僅是一個概念):

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

0

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

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