2016-07-19 43 views
7

だから私は、コードコンパイル時に__func__をwchar_t []に変換できますか?

wchar_t funcName[] = __FUNCTIONW__; 

のこのスニペットを持っていますが、__FUNCTIONW__での問題は、私が望むすべてが関数名であるとき、それは名前でクラス情報を持っています。今__FUNCTIONW__だけ

__func__は、それが内部で使用されたときに、関数名を含む文字列変数に展開され、暗黙的に宣言された識別子である「L__func__が未定義の識別子」私は_CRT_WIDE(__func__)を呼び出すことができると思い作った_CRT_WIDE(__FUNCTION__)を呼び出しますが、それはエラーになります関数のそれはC99のCに追加されました。 C99から§6.4.2.2/ 1:

識別子__func__は暗黙翻訳者によって宣言され、直ちに各関数定義の開口ブレース、

static const char __func__[] = "function-name"; 

が現れ宣言、関数を以下、あたかも-nameは、字句を囲む関数の名前です。この名前は、機能の未装飾の名前です。

これは、__func_がマクロではなく、前処理と関係がないことを意味すると思いますか?

コンパイル時にwchar_t配列を取得する別の方法はありますか?

+0

'__func__'はマクロではないので、' _CRT_WIDE'マクロの前に 'L'を付けるとエラーになります。 –

+0

同じ理由から、文字列連結àla '"こんにちは、私の名前は "__func__"です。 "... – Aconcagua

答えて

1

すでにC標準を引用として(実際に、それは悪いものだ、...あなたはC++標準が必要ですが、そこにあなたが同じことを見つける):

static const char __func__[] = "function-name"; 

かのようにあなたは今、同じ問題を抱えています任意の他の配列をコンパイル時に変換することを望みました。 g:

char buffer[16]; 
// convert to wchar_t[16]? 

int array[4]; 
// convert to double[4]? 

アレイのタイプはint[4]です。それは修正です。これは4 * sizeof(int)バイトのメモリを占有します。通常は最近のマシンでは16バイトですが、魔法のように4 * sizeof(double)バイト、通常は32バイトに変更することはできません無料でアップグレード...)。

コンパイル時にchar const __func__[]wchar_t[]に変更する方法はありません。申し訳ありません。一方、あなたはwchar_tの配列(!配列ではなく、ワイド文字列リテラル)を使用する多くの場所で普通char const配列__func__を使用することができるはずです。

std::wofstream ws; ws << __func__; 
wchar_t buffer[64]; swprintf(buffer, sizeof(buffer), L"%s\n", __func__); 

問題が受諾の機能となりますe。 g。 wchar_t *はchar * overloadを持っていません。その後、実行時に文字列を変換することはありません(mbstowcs参照)。

が、これは便利な機能ごとに一度だけそれを行う方法を考えかもしれません、助けている場合:...

template <size_t N> 
struct F 
{ 
    wchar_t name[N]; 
    F(char const* func) 
    { 
     mbstowcs(name, func, N); 
    } 
}; 
#define F_INIT static F<sizeof(__func__)> func(__func__) 
#define FUNC func.name 

void foo() 
{ 
    F_INIT; 
    std::wcout << FUNC; 
} 

int main(int argc, char* argv[]) 
{ 
    F_INIT; 
    std::wcout << FUNC; 
    return 0; 
} 

は、あなたに最も適切な表示されます任意の名前それら(テンプレート+マクロ)を得

+0

これは非常に賢明です静的な関数の中で宣言varの宣言を利用しています。私の仕事でも、私はwstringに変換してからwchar_t *に変換していました。std :: wstring_convert > converter; std :: wstring ws_func = converter.from_bytes(_ _func_ _); std :: wstringとstd :: wstring_convertのユーティリティを使っただけで、構造体とテンプレートが必要になるのだろうかと疑問に思っていたのですが、 – user1881587

+2

もう一つの方法はありますが、このようにしてください: 'static std :: wstring ws_func(std :: wstring_convert >)from_bytes(__ func __)); '静的であるため、一度だけ構築されます。コンバータは、wstringのctorでのみ使用されているため、一度だけ構築されます。このようにテンプレートや通常の構造体は必要ありません。 – Aconcagua

+0

簡単な方法があります。ファイル(https://stackoverflow.com/a/14421702/2532437)で動作するものは、機能のためにも動作します。これにより、コンパイラはこれを行います。 mbstowcsへの1つのランタイムコールもありません。 –

関連する問題