计算预处理器宏中的Invokations

时间:2014-10-23 10:10:19

标签: c

我需要一个宏,每次替换时都会跟踪这种替换的数量, 这样做的目的是在宏扩展达到certan整数的倍数时进行不同的宏扩展。没有运行时开销是可以接受的。(我不能使用内联函数,如果条件检查等。)

我尝试__COUNTER__如下:

 #define ABC() (__COUNTER__ > 5)? printf("\n hello"): printf("\n ok").

但是当此宏处于循环中时,__COUNTER__不起作用。

上面的printf仅用作示例。

请注意,宏在时间关键上下文中扩展,并且函数开销不可接受以及汇编中的条件分支,使用上面的三元运算符,因为生成的汇编包含条件指令而不是条件分支。

任何其他方法,建议?

1 个答案:

答案 0 :(得分:-1)

如果计数要求很低,你可以避免使用数组和函数指针的分支。

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)