簡體   English   中英

c ++代碼中的#if語句

[英]#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 }

然后假設VAL1VAL2解析為1,代碼do something將編譯並執行,但代碼do something I dont want to do只會編譯 - 但編譯器會通過不將其包含在生成的可執行文件中來優化它。

簡短的回答: 沒有

這些是預處理程序指令 ,在編譯之前(如名稱所示)預處理。 一旦你的程序被編譯; 你不能再改變這種行為了。

不,這只會影響在下一次編譯運行期間解析的標題。 它對您已鏈接的庫的已編譯部分沒有任何影響。

這意味着它可能是一個壞主意。 通常,您希望保持編譯器標志一致,並且包括宏。 我們無法判斷它是否會在這里產生影響但是,除非你確定,否則我會堅持使用相同的宏定義。

如果這意味着您必須重新編譯庫本身,那么您就必須這樣做。

暫無
暫無

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

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