2013-11-21 67 views
7

我想使用字符串化運算符#,但是我得到錯誤stray ‘#’ in program。這是我如何使用它。C/C++中的字符串化運算符

#define STR "SOME_STRING" 
#define BM 8 
#define NUM_OF_THREADS 8 
#define VER_STR (STR #BM #NUM_THREADS) 

我希望得到SOME_STRING88爲​​,而是得到一個錯誤。我在做什麼錯誤?

回答

9

您需要將數字常量轉換爲字符串。但是,#BM是錯誤的,因爲語法只對宏參數有效。 所以你需要通過一箇中間宏強制擴展。而且你可能也有一個字符串化宏來做到這一點:

#include <iostream> 

#define STRINGIFY_(x) #x 
#define STRINGIFY(x) STRINGIFY_(x) 

#define STR "SOME_STRING" 
#define BM 8 
#define S_BM STRINGIFY(BM) 
#define NUM_OF_THREADS 8 
#define S_NUM_OF_THREADS STRINGIFY(NUM_OF_THREADS) 
#define VER_STR STR S_BM S_NUM_OF_THREADS 

int main() { 
    // your code goes here 
    std::cout << VER_STR; 
    return 0; 
} 

你可以看到在上述行動在http://ideone.com/cR1KZP

編輯

由於馬格努斯·霍夫指出的那樣,你可以調用字符串化直接也是如此:

#define VER_STR STR STRINGIFY(BM) STRINGIFY(NUM_OF_THREADS) 
+0

'#BM'不給''BM「,它給出了一個編譯錯誤。 '#'只能用於函數式宏的參數。 – Angew

+0

@Angew,固定。寫作時我腦子裏有一個不完整的解決方案。 – StoryTeller

+1

爲了完整性:它也可以沒有中間單曲_...'-macros,與'的#define VER_STR STR字符串化(BM)字符串化(NUM_OF_THREADS)':http://ideone.com/hbBQIp –