0

__FILE__および__FILEW__マクロがパス全体を返す場合にのみ、ファイル名が必要です。

以下を定義しました。

#define __FILE_NAME_ONLY__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)

私は次のように使用しています:

#define MY_TRACE( mask, format, ... )  \            
            GlobalTrace( mask, L"-[" __FILE_NAME_ONLY__ L":" format , __VA_ARGS__ ) 

次のエラーが表示されます。

エラー C2064: 項は 1 つの引数を取る関数として評価されません

そして、次のマクロを試すと:

#define __WIDE(_String) L ## _String
#define _WIDE(_String) __WIDE(_String) 

次のように

 #define MY_TRACE( mask, format, ... )  \            
                GlobalTrace( mask, L"-[" _WIDE(__FILE_NAME_ONLY__) L":" format , __VA_ARGS__ ) 

エラー C2146 :構文エラー : MY_TRACE マクロを実際に使用しようとすると、識別子 'L' の前に ')'がありません

私は何が欠けていますか?ありがとう

4

2 に答える 2

2

すべての用語が文字列リテラルではないことを除いて、文字列リテラルの連結に依存しています。

以前は次のようにしていたと思います:

#define MY_TRACE( mask, format, ... )  \            
            GlobalTrace( mask, L"-[" __FILE__ L":" format , __VA_ARGS__ ) 

__FILE__文字列リテラルに展開するformatと、4 つの文字列が 1 つに貼り付けられます。"A" "B" "C" "D"と同じ"ABCD"です。

__FILE_NAME_ONLY__これは、リテラルではなく関数呼び出しに展開されるため、with に置き換えると発生しません。

于 2014-12-15T22:11:18.083 に答える
1

gcc を使用している場合、このマクロが役立ちます。

__BASE_FILE__

ここに役立つリストがあります

于 2014-12-15T22:09:46.980 に答える