15

GCCを含む__LINE__多くのツールチェーンを使用して、一般的__FILE__にC++プログラムで使用できます。

__LINE__GCCの下でタイプの式に評価されintます; Nが適切な値であるaに
__FILE__評価されます。char const[N]

  • __FILE__主要なツールチェーンは、 withタイプと同等のものを提供しますwchar const[N]か?
  • もしそうなら、それは何ですか?
4

5 に答える 5

37

あなたはあなた自身を作ることができます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
于 2013-01-20T04:36:07.713 に答える
1

使用する:

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を配置し#て整数を文字列化します。

于 2013-01-20T08:14:41.963 に答える
0

Visual Studio_T()では、たとえば次のように囲みます。

TRACE( _T("function = %s"), _T(__FUNCTION__);
于 2017-11-10T20:10:49.563 に答える
0

私はこの回答を以前の返信へのコメントとして入れていたでしょうが、コメントするための最低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"に展開されます。それらが機能しないと主張する前に物事をテストすることは有用です。

于 2018-02-13T19:32:42.653 に答える
-1

たとえば、constを使用しますauto name = L"" __FUNCTION__;

于 2018-12-25T22:28:22.883 に答える