5

明らかな質問をしている場合はご容赦ください。しかし、たくさんのスレッドを調べて試してみたところ、この単純なことを特定することはできません。

私はこの小さなプログラムを持っています:

#define FUNC_PREFIX __FUNCTION__ "() :"

int main()
{
    printf("%s\n", FUNC_PREFIX);
    return 0;
}

FUNC_PREFIXしたがって、ログ関数の代わりに渡すことができ__FUNCTION__ます。ログ関数の出力の可読性を向上させるために、呼び出し元の関数名の後にパレンとコロンが続きます。

これは、Visual Studio 2008でそのまま正常にコンパイルされます。しかし、g++では、文字列定数の前に「)」と予想されるエラーが発生します。

私は次のようないくつかのことを試みました:

#define TEMP __FUNCTION__ 
#define FUNC_PREFIX TEMP "() :" 

しかし、役に立たない。

これを行う方法は何ですか?

4

2 に答える 2

10

__FUNCTION__標準Cまたは標準C++のいずれのマクロでもありません。

C ++ 2011(§8.4関数定義および§8.4.1一般)とC 1999または2011の両方__func__に、関数の名前である事前定義された識別子があります。これはマクロではないため、プリプロセッサで文字列を連結することはできません。

したがって、MSVS拡張機能をサポートしていない標準準拠のCまたはC ++コンパイラで動作する場合は、コードを修正する必要があります。


GCCマニュアル(バージョン4.6.1用)には、文字列としてのセクション§6.47関数名があります。__FUNCTION__の同義語であるドキュメントです__func__。また、についても説明し__PRETTY_FUNCTION__ます。これらはプリプロセッサマクロではありません。gccしたがって、またはで正しく機能するようにコードを調整する必要がありますg++

于 2012-10-02T20:31:18.120 に答える
1

printfに引用符がありません。識別子__func__を使用すると、マクロを次のように定義すると、2つの文字列を出力できます。

#define FUNC_PREFIX __func__,"() :"

int main()
{
    printf("%s %s\n", FUNC_PREFIX);
    return 0;
}
于 2012-10-02T20:35:31.123 に答える