0

プロジェクトのすべてのソースファイルに沿って増加するマクロを定義しようとしています。__COUNTER__すべてのファイルに個別のマクロとは異なります。次のようなクラスで静的メンバー変数を使用してみました。

class A{
static int GetNextNum() {
 number++;
 return number - 1;
}
private:
  static int number;
};
#define NEXT_NUM A::GetNextNum()

しかし、結果は私が望んでいないものです。たとえば、このサイクルの各反復で同じ数にしたい場合(で発生するように__COUNTER__):

for (int i = 0; i < 10; ++i) {
  doSomething(NEXT_NUM)
}

私が実施したように、それは反復ごとに増加します。必要なことをどのように達成できるかについてのアイデアはありますか?(私はVisual Studioを使用していますが、コンパイラに依存しないソリューションを好みます)。

編集:ここで要求されているように、私がやりたいことに似た何かのミニマルな例です。コードの特定のセクションを通過する回数をカウントするクラスを定義しようとしています。このようなクラスの使用方法は次のとおりです。

for (int i = 0; i < 10; ++i) {
  ExecuteCounter(location_id);
  ... do stuff ...
}

私が追跡してデストラクタに蓄積しているものは他にもたくさんありますが、これで十分にアイデアを得ることができると思います。最初は、エントリが気になる情報を格納するオブジェクトであり、文字列が付加によって形成されるマップを使用しました__FILE____LINE__したがって、場所を一意に識別します)が、これは遅いことがわかりました。そこで、マップを使用する代わりに、テーブルとその中のインデックスを使用することにしました。これにより、全体的な複雑さから対数が削除され、パフォーマンスが大幅に向上します。この説明が私の質問をより明確にすることを願っています。

4

2 に答える 2

1

そのため、コード内の場所を訪れた回数のカウンターが必要であることは理解しています。

そのようなことの基本的な考え方は単純である必要があります。マクロはまず、その場所にアクセスするたびにインクリメントされる静的変数の宣言に展開する必要があります。

static size_t my_count = 0;
++my_count;

マルチスレッドを使用していない場合は、うまくいきます。(お持ちの場合は、新しいアトミック操作を調べてください)。

ここで、カウントの最終結果にどこかでアクセスできるようにする必要もあります。これはstatic、独自のタイプの別の変数を使用して行うのが最も簡単です。この変数はcollector、コンストラクターへの引数として、カウンターのアドレスと命名規則のアプリケーション文字列を受け取ります。

#define DO_ACCOUNTING(NAME)                       \
do {                                              \
  static size_t my_count L = 0;                   \
  static collector my_collector(&my_count, #NAME);\
  ++my_count;
} while(0)

do-while名前空間を汚染しないように、これらの変数のスコープを設定するだけです。

于 2012-05-20T12:38:21.863 に答える
1

このような単純なもので十分でしょうか?

#include <stdio.h>
int g_counter = 0;   // make it visible to other files through 'extern'
#define UPDATE_COUNTER()   {\
                        static int _this_counter_ = 0;\
                        if (_this_counter_ == 0) {\
                           g_counter++;\
                           _this_counter_ = 1;\
                        }\
                     }\
int main() {
   printf("Counter: %d\n", g_counter);
   for (int i=0; i<100; i++) {
      UPDATE_COUNTER();
   }
   printf("Counter: %d\n", g_counter);
   for (int i=0; i<100; i++) {
      UPDATE_COUNTER();
   }
   printf("Counter: %d\n", g_counter);
}

ヘッダー ファイルで g_counter の extern を宣言し、それをすべてのソース ファイルに含めることで、g_counter を他のファイルから見えるようにすることができます。同じヘッダーは、UPDATE_COUNTER マクロにも適しています。

于 2012-05-20T14:01:33.513 に答える