计算预处理器宏中的调用次数

标签 c

我需要一个宏,每次替换时都会跟踪此类替换的数量, 这样做的目的是当宏展开达到某个整数的倍数时,得到不同的宏展开。运行时开销是 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/

相关文章:

c - regexec 损坏 const char * 参数

c - 是否可以使用 Visual Studio 2013 Express for Windows 查找 C 函数的堆栈深度?

python - SWIG/Python : Passing pointer into function

在 C 中导致段错误 |堆栈虚拟内存

C,如果分配不能就地增长,则 realloc 失败

c++ - zip 文件可以是稀疏的/不连续的吗?

c - 如何在不使用system()函数的情况下运行gcc unix命令在C中编译和创建新文件?

c - GCC 链接.o 文件

在C中将IP号的每个部分转换为三位数

c++ - glmapbufferOES 和 glunmapbuffer 在 opengl-es 2.0 中未声明