簡體   English   中英

C ++條件編譯

[英]C++ conditional compilation

我有以下代碼片段:

#ifdef DO_LOG
#define log(p) record(p)
#else
#define log(p)
#endif

void record(char *data){
.....
.....
}

現在如果我在我的代碼中調用log("hello world")並且沒有定義DO_LOG ,那么該行是否會被編譯,換句話說它會占用字符串“hello world”的內存嗎?

PS程序中有很多記錄調用,它對內存敏感,那么有沒有其他方法可以有條件地編譯,這樣它只依賴於#define DO_LOG

通過檢查生成的二進制文件,這對於自己進行驗證應該是微不足道的。

我會說“不”,因為表達式完全消失,編譯器永遠不會看到字符串(它被預處理器的宏擴展刪除)。

由於預處理器在編譯器之前運行,因此編譯器運行時該行甚至不存在。 所以答案是否定的,它根本不使用任何內存。

不,它不會在二進制文件中。 它甚至不會被編譯 - 預編譯器會在編譯之前將它擴展為空字符串,因此編譯器甚至不會看到它。

不會。預編譯器在編譯之前執行,因此甚至不會看到代碼。 但是,我想補充一點,如果您對將日志記錄添加到C ++應用程序感興趣,可能需要使用Log4Cxx庫。 它使用類似的宏,您可以從應用程序中完全忽略它,但是當啟用日志記錄時,它支持幾種不同級別的日志記錄(基於重要性/嚴重性)以及發送日志記錄輸出的多個不同“appender”(例如syslog) ,控制台,文件,網絡I / O等)。

可以在Log4Cxx API文檔中找到完整的API文檔 此外,如果您有任何使用Log4J的 Java開發人員,他們應該感到賓至如歸(並說服您使用它)。

暫無
暫無

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

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