最近專案要從windows平台移植到linux平台,所以做了很多相容性相關的工作。遇到乙個小問題,我想通過win32巨集來區分兩個平台,之前以外win32變數是自己定義到,所以我做了如下宣告:
#define win32 1 //1:windows, 0:linux
程式中這樣使用:
#if win32 1
//do something in windows
#else
//do something in linux
#endif
於是,把整個工程在linux平台下編譯一遍,出現了很多編譯錯誤,均來自於opencv到庫檔案,這是不能容忍的,為這個問題困擾了一天!
最終找到了答案,那是因為opencv在做相容性時,windows用的就是win32這個巨集,而且都是這樣使用的:
#ifdef win32
//do something in windows
當程式中define了win32之後,就認為在linux下定義了win32,所以又去編譯windows相關的東西,顯然這是錯誤的。
所以,得出了結論:
1) win32巨集是windows系統自帶定義的巨集,可直接使用,不用再去define
2) #ifdef的意思表示只要定義了就為真,所以使用時直接#ifdef win32,並且如果#define var 1,那麼var就被定義,就可直接使用#ifdef var,而不管var是多少
3) #if的意思表示如果定義到巨集是否為0,這時就要看巨集到定義了,具體用時就是#if var 1.
乙個小的知識點,就可以困擾你一天,終於明白程式設計規範是多麼重要,謹記!
if和 ifdef的區別
學習stm32偶然發現 在keil中直接預先定義巨集use stdperiph driver,但是卻沒有指定巨集的值。而在標頭檔案中判斷用的是如下 1 ifdef use stdperiph driver 2 include stm32f4xx conf.h 3 endif use stdperip...
ifdef和 if的區別
1 ifdef只是判斷後面的識別符號有沒有定義,而不在乎識別符號的值,識別符號是0是1對它來說都沒有區別,只要預先定義了,執行 ifdef後的 2 ifdef是和 else搭配使用的,沒有 elif搭配之說 3 ifdef必須要有 endif配合使用 define iftest1 0 define ...
if和 ifdef的區別
學習stm32偶然發現 在keil中直接預先定義巨集use stdperiph driver,但是卻沒有指定巨集的值。而在標頭檔案中判斷用的是如下 1 ifdef use stdperiph driver 2 include stm32f4xx conf.h 3 endif use stdperip...