簡體   English   中英

計算預處理器宏中的調用

[英]Counting Invokations in Preprocessor Macros

我需要一個宏,該宏在每次被替換時都記錄這種替換的次數,其目的是當宏擴展達到certan整數倍時具有不同的宏擴展。 沒有運行時開銷是可以接受的。(如果條件檢查等,我不能使用內聯函數)

我嘗試了__COUNTER__ ,如下所示:

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

但是當此宏處於循環中時, __COUNTER__不起作用。

上面的printf僅用作示例。

請注意,宏在時間緊迫的上下文中擴展,並且函數開銷以及匯編中的條件分支都是不可接受的,使用上述三元運算符是因為所生成的匯編包含條件指令而不是條件分支。

還有其他方法,建議嗎?

如果計數要求低,則可以避免使用數組和函數指針的分支。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM