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