我需要一个宏,每次替换时都会跟踪此类替换的数量, 这样做的目的是当宏展开达到某个整数的倍数时,得到不同的宏展开。运行时开销是 Not Acceptable 。(我不能使用内联函数,如果条件检查等)
我尝试了__COUNTER__
,如下所示:
#define ABC() (__COUNTER__ > 5)? printf("\n hello"): printf("\n ok").
但是当此宏处于循环中时,__COUNTER__
不起作用。
上面的 printf 仅用作示例。
请注意,宏在时间关键的上下文中进行扩展,函数开销是 Not Acceptable ,以及汇编中的条件分支,使用上述三元运算符是因为生成的汇编包含条件指令而不是条件分支。
还有其他方法、建议吗?
最佳答案
如果计数要求较低,您可以避免使用数组和函数指针的分支。
typedef void(*Func)(void);
typedef struct {
Func run;
int next;
} Element;
void first(void) {
printf("\n hello");
}
void second(void) {
printf("\n ok");
}
Element array[] = {
{ first, 1 },
{ first, 2 },
{ first, 3 },
{ first, 4 },
{ second, 4 }
};
int i = 0;
#define ABC() \
do { \
array[i].run(); \
i = array[i].next; \
} while(0)
关于计算预处理器宏中的调用次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525816/