[英]Disable functions using MACROS
在互聯網上搜索了相當多的解決方案后,我決定在這里詢問我的解決方案是否正常。
我正在嘗試編寫一個簡單的模塊化C日志庫,旨在簡化禁用,並特別幫助博士生和研究人員調試算法,盡可能減少日志記錄系統的影響。
我的問題是我希望庫的用戶能夠在編譯時禁用日志記錄系統,從而產生一個可執行文件,其中記錄器的成本為0。
C代碼看起來像這樣:
...
logger_t * logger;
result = logger_init(logger);
if(result == -1) {...}
...
這將簡單地初始化記錄器。 尋找一個示例代碼我檢查了assert.h頭,但是在我的情況下,soulution會產生一個警告列表。 實際上,如果使用宏將logger_init()替換為0,則會導致變量logger從未使用過。
出於這個原因,我決定使用這種方法:
int logger_init(logger_t *logger);
#ifndef NLOG /* NLOG not defined -> enable logging */
int logger_init(logger_t *logger) {
...
}
#else /* NLOG defined --> the logging system must be disabled */
#define logger_init(logger) (int)((logger = NULL) == NULL)
#endif /* NLOG */
這不會導致警告,我也避免了調用函數的開銷。 事實上,我的第一次嘗試就是這樣做:
int logger_init(logger_t *logger) {
#ifndef NLOG /* NLOG not defined -> enable logging */
...
#endif
return 0;
}
即使我不需要它也繼續調用該函數。
您認為我的解決方案可以被視為一個好的解決方案嗎? 有更好的解決方案嗎?
非常感謝,伙計們! 干杯,阿曼多
至少在90年代,標准成語是:
#ifndef NLOG
void logger_init(logger_t *logger);
void logger_log(logger_t *logger, ...);
#else
#define logger_init (void)sizeof
#define logger_log (void)sizeof
#endif
請記住,雖然它們是語法檢查的,但不會評估sizeof操作數。 這個技巧也適用於可變參數函數,因為sizeof運算符將看到帶有幾個逗號運算符的表達式:
logger_log(log, 1, 2, 3);
轉換為:
(void)sizeof(log, 1, 2, 3);
這些逗號不是分隔參數( sizeof
不是函數而是運算符),但它們是逗號運算符 。
請注意,我將返回值從int
更改為void
。 沒有真正的需要,但回報的sizeof
將是無意義的。
您的禁用版本不能只是一個常量:
#ifndef NLOG /* NLOG not defined -> enable logging */
int logger_init(logger_t *logger) {
...
}
#else /* NLOG defined --> the logging system must be disabled */
#define logger_init(logger) 0
#endif /* NLOG */
這樣,你只需要(在預編譯之后): result = 0;
這不應該產生任何警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.