GCCを含む__LINE__
多くのツールチェーンを使用して、一般的__FILE__
にC++プログラムで使用できます。
__LINE__
GCCの下でタイプの式に評価されint
ます; Nが適切な値であるaに
__FILE__
評価されます。char const[N]
__FILE__
主要なツールチェーンは、 withタイプと同等のものを提供しますwchar const[N]
か?- もしそうなら、それは何ですか?
あなたはあなた自身を作ることができますWFILE
:
#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)
非ASCII文字とファイル名でテスト済み马克.cpp
:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)
int main() {
_setmode(_fileno(stdout), _O_U16TEXT); // required for Unicode output to console
wprintf(L"%s\n", WFILE);
}
デモ(cmd.exeおよびインストールされている中国語サポートから実行):
C:\>cl /W4 /nologo 马克.cpp
马克.cpp
C:\>马克.exe
马克.cpp
使用する:
WIDE(MEXPAND(__FILE__))
と
WIDE(STRINGIFY(__LINE__))
または、文字列化する必要のあるものに置き換え、拡大したいマクロ文字列リテラルに__LINE__
置き換えます。__FILE__
次の定義を使用します。
#define STRINGIFY2(m) #m
#define MEXPAND(m) m
#define STRINGIFY(m) STRINGIFY2(m)
#define WIDE(m) L ## m
使用例:
#define AssertBreakMethod DebugBreak
#define AssertBreakForce(expr) \
do \
{ \
if (!(expr)) \
{ \
OutputDebugStringW(WIDE(MEXPAND(__FILE__)) \
WIDE("(") WIDE(STRINGIFY(__LINE__)) \
WIDE("): Assertion failed: ") \
WIDE(#expr) WIDE("\n")); \
AssertBreakMethod(); \
} \
} \
while (0)
OutputDebugStringのパラメーター全体は、コンパイル時に静的に1つの文字列リテラルにアセンブルされることに注意してください。
マクロの文字列化の秘訣は、マクロを別のマクロに渡すことです。__FILE__
渡されるとMEXPAND
、その時点で展開されます。MEXPAND
現在は文字列である引数を返します。その場合、先頭のLをそこに配置して幅を広くすることは合法です。
STRINGIFY
同じトリックを実行し、STRINGIFY2
引数を行番号(その時点では整数のように見えます)に展開する引数を渡し、その前にシンボルSTRINGIFY2
を配置し#
て整数を文字列化します。
Visual Studio_T()
では、たとえば次のように囲みます。
TRACE( _T("function = %s"), _T(__FUNCTION__);
私はこの回答を以前の返信へのコメントとして入れていたでしょうが、コメントするための最低50の評判がなかったため、許可されませんでした...
Visual Studioでは、tchar.hヘッダーファイルの_Tの標準定義を変更しない限り、_T(__ FILE__)はL__FILE__に展開されません。_T(__ FILE__)と_T(__ FUNCTION__)は5年前に機能しましたが、現在のファイルと関数の幅広いバージョンを探している場合は、現在でも機能します。
_T(x)は__T(x)として定義され、_UNICODEが定義されている場合はL ## xとして定義され、それ以外の場合はxとして定義されます。したがって、_T(__ FILE__)は__T( "my_file.c")のようなものに展開され、次に_UNICODEに応じてL"my_file.c"または"my_file.c"に展開されます。それらが機能しないと主張する前に物事をテストすることは有用です。
たとえば、constを使用しますauto name = L"" __FUNCTION__;