1

「イベント キュー」を使用してさまざまなスレッドで関数を実行するネイティブ C++ プログラムがあります。ヒープに「イベント」クラスを割り当て、スレッドのキューの 1 つに配置して実行します。

すべてうまく機能しますが、これらの「イベント」の起源をたどるのは非常に困難です。各「イベント」に、それがどこから来たのかに関する情報を保存したいと思います。現在、そのために組み込みを使用_ReturnAddress()していますが、ファイル名の文字列と行番号も取得したいと考えています。「イベント」をスケジュールするためにマクロを使用しても問題ありません。

もちろん、これらの弦を手に入れるための代償は払いたくありません。

プリプロセッサを構築してダンプし、「id」=>「file,line」のマップをファイルする方法はありますか?ここで、「id」は、マクロが展開されるたびにインクリメントされる一意の番号になりますか? そのIDをオリジンとして保存できました。

または、実行時に使用できるように、ファイル名の非常に短いハッシュを計算することもできますか?

どんなアイデアでも大歓迎です。

4

3 に答える 3

4

あなたが使用できるIDのために__COUNTER__.

http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspxから:

0 から始まり、コンパイルで使用されるたびに 1 ずつ増加する整数に展開されます。

__FILE__イベントが割り当てられた場所を追跡するために__LINE__使用できます。

しかし、なぜこれらの出来事の起源を追跡したいのでしょうか? これがデバッグ目的である場合は、特別なデバッグ モードのときに、StackWalk64 を使用して収集されたスタック トレースをクラスに埋め込むことを検討することをお勧めします。これにより、元の場所だけでなく、より多くの有用な情報が得られます。

于 2009-05-28T15:23:44.027 に答える
3

独自のプリプロセッサを作成します。

それほど難しいことではなく、.cpp ファイルを解析して、自分で定義した構文を検索するだけです。見つかったら、ファイル名と行 (プリプロセッサは新しい行の数をカウントする必要があります) をいくつかのログ ファイルに追加します。ただし、独自のマクロを c++ に展開する必要があります。すべてを一時ファイルに書き込み、それを「実際の」コンパイラに渡します。

乾杯 !

于 2009-05-28T15:32:16.957 に答える
1

Boost.Preprocessorを確認してください。これは、標準の C プリプロセッサで強力な機能を実行するためのヘッダーのみのマクロ セットです。

それはかなり複雑です (私はそれを理解していると主張していません) が、あなたが望むことはできると思います。ドキュメントはこちらこちら

于 2009-05-28T15:55:02.793 に答える