2011-07-12 83 views
4

我有一個使用第三方庫的Unicode Win32應用程序,其中一些庫爲其版本信息提供了常量作爲#defined(narrow)字符串。例如,libpng有以下幾點:將字符串宏/常量轉換爲寬字符/ Unicode

#define PNG_LIBPNG_VER_STRING "1.5.4" 
#define PNG_HEADER_VERSION_STRING \ 
" libpng version 1.5.4 - July 7, 2011\n" 

我追加各種靜態鏈接庫的版本信息,我對箱內,便於版本跟蹤,似乎像它會是簡單的這種不斷轉化成一個寬的字符串。

我第一次嘗試是TEXT(PNG_HEADER_VERSION_STRING),但還是失敗,

#define __TEXT(quote) L##quote 

..和LPNGHEADER_VERSION_STRING不存在,當然。

因此,我嘗試了幾種雙重包裝宏和各種##技巧的組合,試圖將L前綴添加到一個宏觀常量,但無法實現。我錯過了一些簡單的東西嗎你會如何處理:

#define VERSIONSTR "Test V1.2.3" 
const char* ver= VERSIONSTR; 
const wchar* wver = _T(VERSIONSTR); // fails, should be L"Test V1.2.3" 
#define VERSIONSTRW _T(VERSIONSTR); // fails also 

編程,沒有簡單地增加一個重複L「V1.2.3測試」,並具有與第三方庫保持同步。

我知道我可以在運行時將其轉換,如果我爲Unicode構建,但我確信有一個快速的方法來重新定義這個常量。

--- UPDATE ---

我錯過了做一些非常愚蠢的我包括結構的情節。解決這個問題可以讓雙重定義包裝器正常工作。我的愚蠢。

+0

你使用什麼編譯器? '#define VERSIONSTRW _T(VERSIONSTR)'在VC++ 2008中適用於我。 – Tim

+0

VS2003。我知道它的舊,但它目前需要。也許它只是我的編譯器中的一個錯誤? – CoreyStup

回答

4

訣竅是使用兩個宏。當一個宏展開時,參數在被替換到替換列表之前被宏展開。所以WIDEN(VERSIONSTR)變成WIDEN2("Test V1.2.3")

#define WIDEN(quote) WIDEN2(quote) 
#define WIDEN2(quote) L##quote 

#define VERSIONSTR "Test V1.2.3" 
#define VERSIONSTRW WIDEN(VERSIONSTR) 
+0

我以前曾嘗試過。 VS與之前單個包裝相同的錯誤失敗。 wchar * str = WIDEN(VERSIONSTR)導致錯誤C2065:'LVERSIONSTR':未聲明的標識符 – CoreyStup

+0

請參閱我的更新。雙重宏技巧在VS2003中工作正常(後來我假設)。我的愚蠢使我無法看清明顯。 – CoreyStup