2009-08-27 3 views
4

gcc 3.3以降で__func__を使用することは可能ですか? (C++)3.3の前に、私は次のマクロを使用するMSコンパイラとgccのバージョンでは

DEBUG_WARNING(...) printf(">WARNING: "__FUNCTION__"() " __VA_ARGS__); 

用途:

DEBUG_WARNING("someFunction returned %d", ret); 

出力:

>WARNING: Class::FunctionName() someFunction returned -1 

その非常に便利私たちにはたくさんのシステムがあり、すべて出力を送信します。その1行のマクロで、出力を適切にフィルタリングすることができます。小さなコード、大きな使用、幸せな私。

__FUNCTION__(およびC++で__func__)の定義が変更されているため(私は信じています)、それもマクロを実行不能にしました。

文字列を手作業で作成する関数を使用していますが、マクロが好きです。

Gcc 3.3でこの単純な1行マクロを使用するには簡単な方法がありませんか?

:D

答えて

5

__FUNCTION____func__ので、あなたは、プリプロセッサ文字列リテラルの連結に使用することはできません、あらかじめ定義された識別子ではなく文字列リテラルです。しかし、printfの書式設定で使用することができます。 __func__とおそらくゼロ引数の間のカンマで問題を回避するには、GNU形式の可変マクロ引数を使用するには、__VA_ARGS__の代わりに##argsを使用することにも注意してください。わずかな変更で、御馳走を作品

#define DEBUG_WARNING(fmt, args...) \ 
    printf(">WARNING: %s() " fmt "\n", __func__, ##args) 
+0

: 'のprintf( "> WARNING:%sの()" FMTは、FUNCTIONは、VA_ARGS)'コンマは私が構築してるのプラットフォーム上で必要とされます。助けてくれてありがとう! :D –

+1

##トリックのヒントをありがとう。 私はマクロを完全にプラットフォームに依存せず、頭痛なくすることができます。これは私の最終的なマクロの外観です: '#define DEBUG_WARNING(fmt、...)printf(">警告、%s() "fmt、__FUNCTION__、## __VA_ARGS__); これはGCC 4.1で正常にコンパイルされます。 1、および他の2つのプラットフォームで使用されるMicrosoftコンパイラも含まれます。 –

関連する問題