2012-08-23 72 views
0

我寫了一個具有多個日誌級別的日誌記錄機制。C宏定義帶條件的前綴宏

LOG_FATAL(s) 
LOG_ERROR(s) 
LOG_WARN(s) 
... 

現在我想能夠激活或停用某些模塊的日誌記錄。 我現在在做什麼:

#ifdef MOUDLE_LOG_ON 
    MODULE_LOG_FATAL(s) LOG_FATAL(s) 
    MODULE_LOG_ERROR(s) LOG_ERROR(s) 
    MODULE_LOG_WARN(s) LOG_WARN(s) 
    ... 
#else 
    MODULE_LOG_FATAL(s) 
    MODULE_LOG_ERROR(s) 
    MODULE_LOG_WARN(s) 
    ... 
#endif 

有沒有辦法來放置前綴在宏使用它是這樣的:

SETUPLOGGING(MODULE) 
+0

我想這甚至不編譯。也許'#define'不會出錯 –

回答

2

我想知道如果使用宏和在線功能可以幫助您解決問題:

void inline LOG_FATAL(const char *s) 
{ 
    printf("%s\n", s); 
} 

#define SETUPLOGGING(x) \ 
    void inline x ## _LOG_FATAL(const char *s) { LOG_FATAL(s); } 

SETUPLOGGING(MODULE) 

int main() 
{ 
    MODULE_LOG_FATAL("hello"); 
} 

預處理後,將產生:

void inline LOG_FATAL(const char *s) 
{ 
printf("%s\n", s); 
} 

void inline MODULE_LOG_FATAL(const char *s) { LOG_FATAL(s); } 

int main() 
{ 
MODULE_LOG_FATAL("hello"); 
} 
2

宏不能定義新的宏。當定義一個宏時,不可能從其他宏創建它的名字,所以你不能使用包含定義你想要的文件的常見工作。

0

你可以使用宏來定義,其中包括你的文件去使用,但是,爲什麼不使用包含文件並在那裏使用宏?