簡體   English   中英

使用MACROS禁用功能

[英]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.

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