2012-05-09 8 views
3

これはどういう意味ですか?マクロ文字列:#define __T(x)xは何を意味しますか?そして__T(#x)?

#define __T(x) x 

ちょうどxを返しますか?

私は私が前に見ていませんでした構文を使用してコードを見ています:

#define CREATE_ENCODER(CODEC) \ 
strcpy(codecName, __T(#CODEC); \ 
pCodec = new CODEC##VideoEncoder(); 
if(parFileName) \ 
{ pEncoderParams = new CODEC##EncoderParams; \ 
} 

ための#は何ですか?

答えて

9

はい、その定義は単に渡された値に置き換えられます。この種の定義は、たとえば次のような場合によく使用されます。変換関数(#define __T(x) translate(x))または値(#define __T(x) x)を使用して値を渡すかどうかをコンパイル時に決定したいhttp://gcc.gnu.org/onlinedocs/cpp/Stringification.html
##は、連結演算子です:

#は、渡された値をstringifies http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

+0

リンクありがとうございます。 – barnes

5

実は__TはTCHAR.Hにあなたが持っている、*またはcharの* wchar_tに文字列を回すために使用されます。

#define __T(x)  L ## x 
UNICODEが有効になっているときに使用

#define __T(x)  x 

あなたのコードは、両方のUNICODEと非UNICODEコンパイルでコンパイルする場合には、

無効になっているときに使用します。

TCHAR * SZ = __T(「マイテキスト」);

最もWINAPI関数がTCHAR *やその形態のいくつかの

実は私は_T()バージョンを好むが、あなたはそれが定義されているTCHAR.Hの下部に、__Tのバージョンが存在を知っていたことはありません使用

#define _T(x)  __T(x) 
#define _TEXT(x) __T(x) 
をだから、戻ってあなたの例に

は:

strcpy(codecName, __T(#CODEC)); \ 

に相当しますUNICODE上非Unicodeビルドで

、および

strcpy(codecName, L"CODEC"); \ 

が構築

!! VERY IMPORTANT:_Tまたは__Tを使用すると、本当に十分なあなたのコードはUNICODEのcompilantされていることを確認していません。これは、WINAPI関数を呼び出すのが簡単になります。 UNICODEの魔法使いを動かすためにコードを準備する必要があります。

+0

重要な注意:このヘッダー(およびマクロ)は、UnicodeにUTF-8を使用しないため、Windows固有のものです。 –

+0

それは間違いです。最初に、もちろん、 'char'テキストはUnicodeになることができます:UTF-8を考えてください。また、マクロを変更するだけでコードをUnicodeに準拠させることはできません。文字の種類が16ビットであるか8だけであるかという単純なことよりもはるかに多くのことがあります。「TCHAR」のようなものは本当に詐欺の一種です。 –

+0

Windows、Windows-ce(UNICODEのみ)ではvisual-C++でどのようにコードするのですか? UTF-8はありません。winapi関数はchar(エンコーディングに注意する必要があります)またはwchar_t(2bytes UNICODE)のいずれかを受け入れます。質問にはvisual-C++というタグが付いていますので、MS固有の回答はOKです。私はそれが明らかだと思ったが、私はコメントを追加した__Tは、ユニコード準拠のコードにあなたのアプリを有効にしません:) – marcinj