2011-07-12 30 views
4

サードパーティのライブラリを使用するUnicode Win32アプリケーションがあります。その中には、バージョン情報の定数を狭い文字列として提供するものがあります。例えば、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プレフィックスを追加しようとするすべての種類の##のトリックをいくつか組み合わせましたが、できませんでした。私は何か簡単なものを逃していますどのように対処します:

単に重複L「テストV1.2.3」を追加し、サードパーティのライブラリと同期してそれを維持することなく、プログラム
#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 

を、。

私はUnicodeのためにビルドしている場合、実行時に変換することができますが、確かにこの定数を再定義するための素早い方法があると思いました。

--- --- UPDATE

私は私が構造を含めて、本当に愚かな何かをすることによってプロットを逃しました。それを修正することで、double定義ラッパーが機能するようになりました。私の愚かな部分。

+0

どのコンパイラを使用していますか? VC++ 2008で '#define VERSIONSTRW _T(VERSIONSTR)'が動作します。 – Tim

+0

VS2003。私は古いことを知っていますが、現在は必要です。おそらく私のコンパイラのバグでしょうか? – CoreyStup

答えて

4

トリックは2つのマクロを使用することです。マクロが展開されると、引数は置換リストに代入される前にマクロ展開されます。従って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

関連する問題