2013-12-09 158 views
0

如果我將兩個字符串傳遞給它,PLUS宏如何工作,它會將它們解析爲枚舉值? 在此先感謝。 對不起,我不能表達得太清楚。宏要打印一個字符串

#include "stdio.h" 
#include <string> 
#include <iostream> 

using namespace std; 

#define PRINT(Y) #Y 
#define PLUS(X, Y) X+Y 

int main(int argc, char *argv[]) 
{ 
    typedef enum { 
     FIRST, 
     SECOND, 
     THIRD 
    }; 

    const char *a="THIRD", *b="SECOND"; 
    cout << PRINT(THIRD+SECOND is:) << PLUS(a, b) << endl; 
    return 0; 
} 
+1

您正在使用[保留標識符](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier)。而**從不**使字符串文字的非const char *指向。 – chris

+2

爲什麼你需要一個宏?爲什麼'std :: cout << a'不夠? –

+2

@JoeZ你真的抱怨他發佈了一個簡短的測試例子,只解釋他的問題,而不是他正在處理的整個代碼?來吧。 – Staven

回答

2

我認爲,從隨訪的評論,我更好地理解你想要做什麼:試圖讓這兩個字符串的形式和符號的非字符串形式,如枚舉值。

的方式,我通常做,這是如下:

#define Q(x) QQ(x) 
#define QQ(x) #x 

然後你用非字符串值中使用它,比如一個枚舉:

enum { FRED = 1, BARNEY = 2 }; 

int main() 
{ 
    std::cout << "The enum " << Q(FRED ) << " has the value " << FRED << std::endl; 
    std::cout << "The enum " << Q(BARNEY) << " has the value " << BARNEY << std::endl; 
} 

此打印:

The enum FRED has the value 1 
The enum BARNEY has the value 2 

如果這不是你想要完成的,請澄清你的問題,並給我留下評論。

+0

嗨,喬,我編輯了我的問題,並使其更清晰。 – miniduan

+0

@miniduan:看到你修改後的問題後,我相信你所要求的是不可能的。編譯器需要在_compile_時間將'enum'值看作標識符。沒有辦法「解開」並獲得隱藏在字符串文字中的枚舉標識符。編譯器可以走相反的方向,並將引號放在某處(即將'FIRST'變成'「FIRST」')。如果您需要查找字符串並將它們轉換爲值,則可以在_run_時間(而不是_compile_時間)使用'std :: map '這樣的方法來完成。 –

+0

在你的例子的上下文中,你可能已經寫了'cout <<「THIRD + SECOND是」<< THIRD + SECOND << endl'沒有宏。還不清楚的是爲什麼你需要額外的間接水平。 –