6

サードパーティのライブラリを使用するUnicodeWin32アプリケーションがあります。その一部は、バージョン情報の定数を#defined(狭い)文字列として提供します。たとえば、libpngには次のものがあります。

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

静的にリンクされたさまざまなライブラリのバージョン情報をAboutBoxに追加して、バージョンを簡単に追跡できるようにしています。この定数を幅の広い文字列に変換するのは簡単なようです。

私の最初の試みは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 "Test V1.2.3"を追加するだけでなく、サードパーティのライブラリとの同期を維持する必要もありません。

Unicode用にビルドしている場合は、実行時に変換できることはわかっていますが、この定数を再定義する簡単な方法があると確信していました。

- -アップデート - -

インクルード構造で本当に愚かなことをして、プロットを逃しました。二重定義ラッパーが正常に機能できるように修正しました。私の側では愚かです。

4

1 に答える 1

6

秘訣は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)
于 2011-07-12T19:14:36.647 に答える