[英]#if statements in c++ code
我正在使用第三方庫,我沒有編譯他們的來源,只包括來自/usr/include
的頭文件。
我知道源代碼包含如下所示的塊:
#if VAL1 && VAL2
do something
#else
do something I dont want to do
#endif
我知道VAL2
設置為1
,但VAL1
設置為0,位於內部某處的不同文件中。
我想要做的是自己定義VAL1
,通過復制將VAL1
設置為0
的標題的內容,並自己設置值。
這樣做是為了當庫的代碼運行時,它會運行到第一個塊嗎? 或者在編譯時它是完全靜態的?
預處理器宏是編譯時的東西。 您通常使用它們來確保編譯器知道在某些情況下如何表現。 例如,當您為不同的平台使用不同的庫時。
更多信息在這里
這樣做是為了當庫的代碼運行時,它會運行到第一個塊嗎? 或者在編譯時它是完全靜態的?
答案是:它在編譯時完全是靜態的。
如果您想編譯代碼的兩個版本,那么根據使用此if/def
宏的上下文,您可以:
if (VAL1 && VAL2)
{ do something }
else
{ do something I dont want to do }
然后假設VAL1
和VAL2
解析為1,代碼do something
將編譯並執行,但代碼do something I dont want to do
只會編譯 - 但編譯器會通過不將其包含在生成的可執行文件中來優化它。
簡短的回答: 沒有
這些是預處理程序指令 ,在編譯之前(如名稱所示)預處理。 一旦你的程序被編譯; 你不能再改變這種行為了。
不,這只會影響在下一次編譯運行期間解析的標題。 它對您已鏈接的庫的已編譯部分沒有任何影響。
這意味着它可能是一個壞主意。 通常,您希望保持編譯器標志一致,並且包括宏。 我們無法判斷它是否會在這里產生影響但是,除非你確定,否則我會堅持使用相同的宏定義。
如果這意味着您必須重新編譯庫本身,那么您就必須這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.