2013-03-20 14 views
8

私はロギング/トレースユニットで作業しています(を入力しないでください。は既存のものを指していません。これは結果と同じくらいの経験です)。スタック上の匿名オブジェクト(C++)?

ランタイムコールスタックトレースを取得するには、最初にTraceObjectインスタンスを作成し、現在のクラスと関数の情報を含む関数を入力することをお勧めします。やや似て:

TraceObject to("MyClass", "myClassFunction"); 

スレッドごとのスタックにプッシュTraceObjectthisのコンストラクタ、デストラクタは再びそれをポップ。スタックはコールスタックのために問い合わせることができます。

私はこれを満足しています。しかし、小さなスニッヒがあります:オブジェクトto。設計上、は決してという名前で呼ばれます。したがって、にはという名前があり、少なくともクライアントの識別子と衝突する可能性があります(または、接頭辞が_の場合は実装)。

TL; DR

は、それがスタック上に匿名、非一時的なオブジェクトを作成することは可能です(関数が戻るまで生きるだろうつまり1が、識別子を持っていません)、はいの場合、どのようにして完了しますか?

+3

私はそれは厳密に可能であると思ういけないが、マクロとあいまいな名前で、あなたは同じことを達成することができます。それが無名であることが必要な正当な理由があるのか​​、それとも本当に必要なものではないのでしょうか? –

+0

@ KarthikT:はい、ラッパーマクロが一般的なアイデアでした。私は「不明瞭」をなくし、「不可視」を達成できるかどうか疑問に思っていました。 – DevSolar

+0

@ Karthik T正確には、それがどのようにブーストログでそれを行うのですか?私の推測では、他の方法はありません – stijn

答えて

5

式の結果であるC++で匿名オブジェクト、一時は、しかし、彼らは彼らだけが中にある文のコンテキストに住んでいます。

あなたが実際にしようとすると、あります。匿名のオブジェクトを宣言すると、パーサーを混乱させ、関数を宣言していると思います!


しかし、それは必要ですか?

マクロを使用して実際にTraceObjectを宣言する場合は、各トレースにマクロを使用するだけで簡単です。そこでクラスと機能を提供します。 __func__またはそれと同等のものを使用すると、クラス名と関数名(コンパイラに依存する文字列解析のビット)を抽出してそこから作業することができます。

もちろん、ファイル名と行番号が必要なので、とにかくトレースごとにマクロを使用しています。

+0

あなたはconst参照で一時オブジェクトのライブ時間を延ばすことができますが、const参照inselfは一時オブジェクトの別の名前です:const T&r = T(); – AnatolyS

+0

@AnatolyS:const-referenceまたはrvalue-reference(C++ 11では)しかし、あなたが指摘したように、とにかく識別子を導入します。 –

+0

私は '__func__'方法がその実装として定義されているのが好きではありません。しかし、匿名のオブジェクトが可能かどうか(「いいえ」)、実際に質問に答えるためのチェックマークが表示されます。 ;-) – DevSolar

3

私のコメントでは、スコープ限定匿名変数は使用できません。

クラス名を取得するためのコンパイラマクロがあれば、これを行う必要があります。

編集:クラス名を取得する簡単な方法はありません。Class name macroのようなことをする必要があります。または、__FILE__とするだけです。

編集:いずれかまたは両方が必要な場合は、__func____FUNCTION__を試してみるとよいでしょう。 C++標準も指定されていません。

+0

AFAIK、 '__func__'はC++標準にはなく、ちょうどCです。これはC++ 11で変更されていますか? – DevSolar

+0

@DevSolarどちらも__FUNCTION__ですか?どんなアイデアがより良くサポートされていますか? –

1

いくつかの行番号のもの:

#define XPASTE(arg1, arg2) PASTEX(arg1, arg2) 
#define PASTEX(arg1, arg2) arg1 ## arg2 
#define TRACELOG() \ 
      TraceObject XPASTE(trace_object, __LINE__) 
+0

'__LINE__'を追加することであまり難読化されることはあまりありませんが、少なくとも2番目の' TraceObject'が作成された場合は警告を "シャドウイング" .. – DevSolar

関連する問題