C ifdef的簡單條件編譯

2021-09-16 23:42:07 字數 1733 閱讀 5161

今天在看原始碼時, 發現乙個很神奇的用法, 可能有大神在以前早已知曉甚至經常使用, 不過對於菜鳥的我來說, 還是像發現新大陸那樣 , 究竟是什麼語法呢? 我們一步步來看看吧:

#include "stdio.h"

int main()

}return 3;

}

**邏輯比較簡單, 主要的意思就是: 當1==1(恒為真), 分別執行:

printf("hello, if\n");

printf("testtest");

其中, 巢狀的{}可以不用管, 因為在c語言並未沒有嚴格的限制, 只要這個完整成對就可以.

上面的輸出結果是:

可能有些童鞋不解這個{}, 因為這個看起來很干擾人, 為什麼要這麼寫? 一開始我也很好奇這樣的用法有什麼意義? 但如果看到下面的**, 可能我們就能明白這樣語法的其中一些意義了..

不賣關子了, 在原來的基礎上, 再完善下**:

#include "stdio.h"

int main()

else

#endif

}return 3;

}

能看到差別麼? 差別就是多了中間那段#ifdef....#endif

熟悉c的童鞋都見過這個語法, 不過在這裡還是簡單介紹下這個語法:

這種語法叫做:條件編譯

條件編譯:

可以通過設定不同的條件,在編譯時編譯不同的**,預編譯指令中的表示式與c語言本身的表示式基本一至如邏輯運算、算術運算、位運算等均可以在預編譯指令中使用。之所以能夠實現條件編譯是因為預編譯指令是在編譯之前進行處理的,通過預編譯進行巨集替換、條件選擇**段,然後生成最後的待編譯**,最後進行編譯。

從上面的解釋,我們可以知道, 因為這段在預編譯指令, 讓我們的**能夠更加自由靈活的實現我們想要的效果.

就好像上面新增後的**, 大體的意思是: 如果hehe有被巨集定義語法所定義.那麼那段**將會生效, 實際**將變成下面那樣:

if(1 == 1)

else

可以看到效果了嗎? 如果這段在條件編譯範圍內的**生效了, 那麼下面的else將和我們之前看似多餘的{}組成了乙個else**塊.又因為1==1, 所以只會執行

printf("hehe\n");
而不會執行:

printf("testtest");
來看看執行結果:

這似乎沒有出現我們上面說的結果, 是因為什麼呢? 當我們回顧下**, 我們會發現, 這個輸出是正確的, 因為我們沒有定義hehe, 事不宜遲, 在頭部加上巨集定義:

#define hehe 123
最終源**:

#include "stdio.h"

#define hehe 123

int main()

else

#endif

}return 3;

}

再執行一下, 得到結果:

ifdef 條件編譯,其實如此簡單

今天看乙個問題 怎麼消滅標頭檔案被多次include導致的錯誤?一種方法是 在標頭檔案的開頭寫下 pragma once pragma once 比較常用 只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次,這條指令實際上在vc6中就已經有了,但是考慮到相容性並沒有太多的使用它。prag...

條件編譯 if

1 為什麼需要條件編譯 客戶的需求在不停地發生變化,一會兒需要這個功能,一會兒不需要這個功能。我們可以使用條件編譯來方便地裁剪功能。2 條件編譯語句 if 條件編譯語句 if的形式是 1 if expression 2.3 elif expression 4.5 elif expression 6....

if 條件編譯

1.格式 if constant expressionstatements elif constant expressionstatements else statements endif 其中 constant expression 常量表示式 字面值常量,或者乙個有 define定義的符號 由預...