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 ...
}

还有很多我在析构函数中记录和积累的东西,但我相信这足以让你明白这一点。起初,我使用了一个地图,其中 entry 是我存储我关心的信息的对象,字符串是通过附加__FILE__with形成的__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);
}

您可以通过在头文件中为其声明一个 extern 并将其包含在所有源文件中来使 g_counter 对其他文件可见。同样的头文件也是 UPDATE_COUNTER 宏的好地方。

于 2012-05-20T14:01:33.513 回答