C: #ifdef的簡單條件編譯

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

#include "stdio.h"
int main()
{
    if(1==1)
    {
        printf("Hello, If\n");
        {
            printf("testtest");
        }
    }
    return 3;
}

代碼邏輯比較簡單, 主要的意思就是: 當1==1(恆爲真), 分別執行:

printf("Hello, If\n");
printf("testtest");

其中, 嵌套的{}可以不用管, 因爲在c語言並未沒有嚴格的限制, 只要這個完整成對就可以. 上面的輸出結果是:

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

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

#include "stdio.h"
int main()
{
    if(1 == 1)
    {
        printf("Hello, If\n");
        #ifdef HEHE
        if (1==1)
        {
            printf("hehe\n");
        }
        else
        #endif
        {
            printf("testtest");
        }
    }
    return 3;
}

能看到差別麼? 差別就是多了中間那段#ifdef....#endif 熟悉C的童鞋都見過這個語法, 不過在這裏還是簡單介紹下這個語法: 這種語法叫做: 條件編譯

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

從上面的解釋,我們可以知道, 因爲這段在預編譯指令, 讓我們的代碼能夠更加自由靈活的實現我們想要的效果. 就好像上面添加後的代碼, 大體的意思是: 如果HEHE有被宏定義語法所定義.那麼那段代碼將會生效, 實際代碼將變成下面那樣:

if(1 == 1)
   {
       printf("Hello, If\n");
       if (1==1)
       {
           printf("hehe\n");
       }
       else
       {
           printf("testtest");
       }

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

printf("hehe\n");

而不會執行:

printf("testtest");

來看看運行結果:

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

#define HEHE 123

最終源代碼:

#include "stdio.h"
#define HEHE 123
int main()
{
    if(1 == 1)
    {
        printf("Hello, If\n");
        #ifdef HEHE
        if (1==1)
        {
            printf("hehe\n");
        }
        else
        #endif
        {
            printf("testtest");
        }
    }
    return 3;
}

再運行一下, 得到結果:

這纔是我們預計中的結果, 通過上面一個簡單的示範, 我們就能比較清楚這個條件編譯的語法可以讓我們的代碼變得多靈活, 如果有哪裏說得不正確, 歡迎大神指點!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章