2010-09-30 115 views
1

我想連接使用宏兩個寬字符串,所以我定義了一些宏:如何使用C中的宏連接兩個寬字符串?

#define VERSION_MAJOR 1 
#define VERSION_MINOR 1 
#define VERSION_BUILD 0 
#define VERSION_REVISION 0 


#define _STR(s) #s 
#define STR(s) _STR(s) 

#define _TOWSTRING(x) L##x 
#define TOWSTRING(x) _TOWSTRING(x) 


//http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string 
#define PRODUCT_ELASTOS_VERSION STR(VERSION_MAJOR) "." \ 
           STR(VERSION_MINOR) "." \ 
           STR(VERSION_BUILD) "." \ 
           STR(VERSION_REVISION) 

現在我想用宏觀PRODUCT_ELASTOS_VERSION定義一個新的宏PRODUCT_ELASTOS_VERSION_W,它的值應該是L「1.1.0.0」。那我該如何定義這個宏呢? TOWSTRING(PRODUCT_ELASTOS_VERSION)是錯誤的答案。

如果我想連接字符串,應該如何寫? L「v」TOWSTRING(PRODUCT_ELASTOS_VERSION)無法獲得寬字符串L「v1.1.0.0」。

+0

請注意,在標識符的開頭處後面跟着大寫字母「_」是一個保留字(可以是C++ onl不過,我不確定)。您可以將'_'放在末尾,就像'STR_'和'TOWSTRING_'一樣。 – Shahbaz 2012-03-01 23:43:30

+0

另外,BUILD之後不應該REVISION?關於保持構建計數,看看[這裏](http://stackoverflow.com/questions/7713459/how-do-you-track-the-build-count-of-your-library-when-there-are (或者你可能有更好的主意!) – Shahbaz 2012-03-01 23:44:41

回答

0

首先,PRODUCT_ELASTOS_VERSION不會擴展爲 「1.1.0.0」,它擴展爲

"1" "." "1" "." "0" "." "0"

保持相同的結構,你可以定義擴展到

L"1" L"." L"1" L"." L"0" L"." L"0"

另一個標識
#define _LSTR(s) L ## #s 
#define LSTR(s) _LSTR(s) 

#define ANOTHER_IDENTIFIER LSTR(VERSION_MAJOR) L"." \ 
          LSTR(VERSION_MINOR) L"." \ 
          LSTR(VERSION_BUILD) L"." \ 
          LSTR(VERSION_REVISION) 
+0

這不是最好的方法,因爲如果我定義PRODUCT_NAME「hello wold」,那麼wprintf(L「%s \ n」,L「 v「TOWSTRING(PRODUCT_NAME))正常工作,但wprintf(L」%s \ n「,TOWSTRING(PRODUCT_VERSION))是錯誤的。我希望每個宏都能以相同的方式工作。 – xufan 2010-10-01 03:51:05