我瞭解到if
或#if
都可以用於條件檢查。 由於我們可以使用if
來檢查條件,爲什麼我們會使用預處理器#if
?「if」和「#if」;哪一個更好用
如果我使用#if
而不是if
,它與我的代碼有什麼區別?
哪一個更好用,爲什麼?
我瞭解到if
或#if
都可以用於條件檢查。 由於我們可以使用if
來檢查條件,爲什麼我們會使用預處理器#if
?「if」和「#if」;哪一個更好用
如果我使用#if
而不是if
,它與我的代碼有什麼區別?
哪一個更好用,爲什麼?
if
和#if
是具有不同的目的不同的東西。
如果使用if
語句,則會在運行時評估條件,並且兩個分支的代碼都存在於已編譯的程序中。該條件可以基於運行時信息,例如變量的狀態。 if
用於程序中的標準流量控制。
如果使用預處理器的#if
,則在編譯時評估條件,並且編譯的程序中包含的假分支代碼爲而不是。該條件只能基於編譯時信息(例如#define
常量等)。 #if
是針對不同編譯時環境的不同代碼(例如,在Windows和* nix上編譯的不同代碼,諸如此類)。
尼斯和乾淨的解釋。謝謝 – kalmanIsAGameChanger 2016-11-03 13:09:54
我們不能說用哪個更好,因爲一個是在編譯階段(#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");
*/
}
「一個用於編譯階段(#if),另一個用於編譯階段(if)」;) – 2013-05-08 12:38:48
@MichalB。它是錯字:) – MOHAMED 2013-05-08 13:12:26
如果在編譯時知道條件的結果,並且在運行時才知道結果,則應該使用#if。
#if DEBUG
我知道在編譯時我正在調試建立
if (date == DateTime.Today)
在今天是什麼日子
取決於嘿都是不同
#if
測試,如果條件在編譯時是真實的。if
在運行時進行評估。的#if
一些用途是:
因爲所有的上述的在編譯時檢查,這意味着:
例子:
只添加調試模式額外的檢查:
#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
查找「預處理器」。 – 2013-05-08 10:50:30
我不明白-1s。雖然完全沒有意思,但這是一個非常有效的問題。如果您不知道「預處理器」關鍵字,那麼不容易實現。 – Dariusz 2013-05-08 10:53:14
我不明白「接近不具有建設性」的選票:這是一個有點簡單但完全合法的問題。 – dasblinkenlight 2013-05-08 10:56:40