C++ 创建一个沿所有文件递增的计数器宏

标签 c++ macros

我正在尝试定义一个沿着我项目的所有源文件递增的宏。与 __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 ...
}

我还跟踪并在析构函数中积累了大量其他内容,但我相信这足以让您理解这个想法。起初我使用了一个 map ,其中条目是一个对象,我在其中存储我关心的信息,字符串是通过附加 __FILE____LINE__ 形成的(因此唯一标识位置),但这被证明很慢。因此,我决定不使用 map ,而是使用其中的表格和索引。这将从整体复杂性中去除对数并显着提高性能。希望这个解释能让我的问题更清楚。

最佳答案

像这样简单的东西就够了吗?

#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 宏的好地方。

关于C++ 创建一个沿所有文件递增的计数器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10672524/

相关文章:

.net - 在预构建事件上运行 Visual Studio 2008 宏

c++ - Direct3D 导入库的用途是什么?

c++ - 对于基本类型中的位数,我应该使用什么类型?

c++ - 在C++中动态输入二维字符数组

c++ - 如何在Qt表项中定位QIcon?

c - 组合两个 _Generic 时出现错误

c++ - 遍历数组以线性时间找到第二大元素

msbuild - 在 msbuild (12.0) 命令行属性分配上引用宏

unit-testing - 如何对 clojure.core.async go 宏进行单元测试?

C 元宏模式匹配