2013-05-08 97 views
19

我瞭解到if#if都可以用於條件檢查。 由於我們可以使用if來檢查條件,爲什麼我們會使用預處理器#if「if」和「#if」;哪一個更好用

如果我使用#if而不是if,它與我的代碼有什麼區別?

哪一個更好用,爲什麼?

+4

查找「預處理器」。 – 2013-05-08 10:50:30

+11

我不明白-1s。雖然完全沒有意思,但這是一個非常有效的問題。如果您不知道「預處理器」關鍵字,那麼不容易實現。 – Dariusz 2013-05-08 10:53:14

+12

我不明白「接近不具有建設性」的選票:這是一個有點簡單但完全合法的問題。 – dasblinkenlight 2013-05-08 10:56:40

回答

28

if#if是具有不同的目的不同的東西。

如果使用if語句,則會在運行時評估條件,並且兩個分支的代碼都存在於已編譯的程序中。該條件可以基於運行時信息,例如變量的狀態。 if用於程序中的標準流量控制。

如果使用預處理器的#if,則在編譯時評估條件,並且編譯的程序中包含的假分支代碼爲而不是。該條件只能基於編譯時信息(例如#define常量等)。 #if是針對不同編譯時環境的不同代碼(例如,在Windows和* nix上編譯的不同代碼,諸如此類)。

+0

尼斯和乾淨的解釋。謝謝 – kalmanIsAGameChanger 2016-11-03 13:09:54

12

我們不能說用哪個更好,因爲一個是在編譯階段(#if),另一個用於在運行階段使用(if

#if 1 
    printf("this code will be built\n"); 
#else 
    printf("this code will not\n"); 
#endif 

嘗試建立上面的代碼與gcc -E,你會看到你的編譯器會生成唯一包含另一個代碼:

printf("this code will be build\n"); 

其他的printf將不會出現在新的代碼(預處理器代碼),然後在程序二進制不存在。

結論:#if在編譯階段治療,但正常if被視爲當你的程序運行

你可以在你的代碼的一部分使用#if 0序,以避免編譯器來編譯它。這就像你有評論這一部分

例如

int main(void) { 

     printf("this code will be build\n"); 
#if 0 
     printf("this code will not\n"); 
#endif 

} 

這相當於

int main(void) { 

     printf("this code will be built\n"); 
/* 
     printf("this code will not\n"); 
*/ 

} 
+0

「一個用於編譯階段(#if),另一個用於編譯階段(if)」;) – 2013-05-08 12:38:48

+0

@MichalB。它是錯字:) – MOHAMED 2013-05-08 13:12:26

3

如果在編譯時知道條件的結果,並且在運行時才知道結果,則應該使用#if。

#if DEBUG 

我知道在編譯時我正在調試建立

if (date == DateTime.Today) 

在今天是什麼日子

6

取決於嘿都是不同

  1. #if測試,如果條件在編譯時是真實的。
  2. if在運行時進行評估。
1

#if一些用途是:

  • 你想放加印,或檢查時你建立你的代碼的調試版本
  • 要確保編譯器不包括.h文件兩次
  • 要編寫將使用不同系統調用的代碼,並根據系統使用相應的系統進行編譯。

因爲所有的上述的在編譯時檢查,這意味着:

  • 條件必須能夠在編譯時被評估
  • 所產生的代碼將不包含計算結果爲分支假,導致代碼更小,速度更快,因爲每次程序運行時都不檢查條件。

例子:

只添加調試模式額外的檢查:

#define DEBUGLEVEL 2 

#if DEBUGLEVEL > 1 
    printf("The value of x is: %d", x); 
#end if 

#if DEBUGLEVEL > 2 
    printf("The address of x is: %x", &x); 
    ASSERT(x > 100); 
#end if 

確保頭只被包含一次:

#ifndef PERSON_H 
#define PERSON_H 
    class Person{ 
     .... 
    }; 
#end if 

取決於平臺有不同的代碼:

#ifdef WINDOWS 
    time = QueryPerformanceCounter(..); 
#else 
    time = gettimeofday(..); 
#endif 
相關問題