目錄
條件編譯
1.條件編譯如何使用?
2.為何要有條件編譯?
3. 條件編譯都在哪些地方用?
條件編譯
1.條件編譯如何使用?
????????C語言的條件編譯是一種在程序編譯時根據(jù)條件選擇不同代碼段進(jìn)行編譯的技術(shù)。條件編譯可以用于實現(xiàn)代碼跨平臺,開啟或關(guān)閉某些功能,以及調(diào)試等情況。
#ifdef` 指令用于判斷某個宏是否被定義,不論我們定義的宏為真為假,如果被定義則編譯下面的代碼塊,否則跳過:
#include <stdio.h>
//#define PTINT
//#define PTINT 1 //真
//#define PTINT 0 //假
int main()
{
#ifdef PRINT //PRINT并沒有被[定義],所以代碼只保留#else部分
printf("hello world!\n");
#else
printf("Non Message!\n");//這句代碼會被輸出
#endif
return 0;
}
與 `#ifdef` 相對應(yīng)的是 `#ifndef`,它用于判斷某個宏是否未被定義:
#include <stdio.h>
//#define DEBUG
int main()
{
#ifndef DEBUG //DEBUG并沒有被[定義],所以代碼會輸出#ifndef內(nèi)容
printf("hello debug\n");//這句代碼會被輸出
#else
printf("hello release\n");
#endif
return 0;
}
`#if` 指令可以根據(jù)表達(dá)式的值來判斷是否編譯下面的代碼塊。
// 單個條件的情況
#include <stdio.h>
//報錯
//#define DEBUG
//定義了,為假
//#define DEBUG 0
//定義了,為真
#define DEBUG 1
int main()
{
#if DEBUG
printf("hello bitworld\n");
#endif
return 0;
}
//帶else的情況
#include <stdio.h>
//報錯
//#define DEBUG
//定義了,為假
#define DEBUG 0
//定義了,為真
//#define DEBUG 1
int main()
{
#if DEBUG
printf("hello world\n");
#else
printf("hello bit\n");
#endif
return 0;
}
//多條件的情況
//代碼一:
#include <stdio.h>
//#define DEBUG 0
//#define DEBUG 1
//#define DEBUG 2
#define DEBUG 3
int main()
{
#if DEBUG==0
printf("hello world 0\n");
#elif DEBUG==1
printf("hello world 1\n");
#elif DEBUG==2
printf("hello world 2\n");
#else
printf("hello else\n");
#endif
return 0;
//代碼二:
#include <stdio.h>
#define DEBUG -1
//#define DEBUG 0
//#define DEBUG 1
//#define DEBUG 2
int main()
{
#if DEBUG<0
printf("hello world 0\n");
#elif DEBUG<1
printf("hello world 1\n");
#elif DEBUG<2
printf("hello world 2\n");
#else
printf("hello else\n");
#endif
return 0;
}
#if模擬#ifdef
#include <stdio.h>
#define DEBUG
int main()
{
#if defined(DEBUG)
printf("hello debug\n");//這句話會被輸出
#else
printf("hello release\n");
#endif
return 0;
}
#if模擬#ifndef
#include <stdio.h>
//#define DEBUG
int main()
{
#if !defined(DEBUG)
printf("hello debug\n");//這句話會被輸出
#else
printf("hello release\n");
#endif
return 0;
}
練習(xí)
#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C) && defined(CPP)
//#if (defined(C) && defined(CPP)) //建議使用這種方式
printf("hello c&&cpp\n");//這句話會被輸出
#else
printf("hello other\n");
#endif
return 0;
}
????????這段代碼使用了條件編譯指令,定義了兩個宏C和CPP,并且使用#if defined指令判斷是否同時定義了這兩個宏。
????????當(dāng)同時定義了C和CPP時,程序執(zhí)行#if defined(C) && defined(CPP)條件滿足,會輸出"hello c&&cpp"。如果C和CPP沒有同時定義,則條件不滿足,會輸出"hello other"。
在這段代碼中,#if defined(C) && defined(CPP)和#if (defined(C) && defined(CPP))的效果是相同的。兩者都是判斷C和CPP是否都已經(jīng)被定義了,如果都被定義,則條件滿足,執(zhí)行相應(yīng)的代碼塊。
????????注意,程序中使用#define指令定義的宏只是簡單的文本替換,不會經(jīng)過類型檢查和語法檢查。因此在使用宏時需要謹(jǐn)慎,避免出現(xiàn)不必要的錯誤。
#include <stdio.h>
#define C
//#define CPP
int main()
{
#if defined(C) || defined(CPP)
//#if (defined(C) || defined(CPP))
printf("hello c||cpp\n");//這句話會被輸出
#else
printf("hello other\n");
#endif
return 0;
}
????????這段代碼與前面的稍有不同,它使用#if defined指令判斷了C和CPP是否至少有一個被定義了,即#if defined(C) || defined(CPP)。當(dāng)C和CPP中至少有一個被定義時,條件滿足,會輸出"hello c || cpp"。否則條件不滿足,會輸出"hello other"。
????????和前面一樣,注釋掉#define CPP的語句,則只有C被定義,條件不滿足,會輸出"hello other"。
????????需要注意的是,#if defined(C) || defined(CPP)和#if (defined(C) || defined(CPP))的效果也是相同的,這兩種寫法都是判斷C和CPP是否至少有一個被定義了,如果有,則條件滿足,執(zhí)行相應(yīng)的代碼塊。
#include <stdio.h>
#define C
#define CPP
int main()
{
#if !(defined(C) || defined(CPP))
printf("hello c || cpp\n");//這句話會被輸出
#else
printf("hello other\n");
#endif
return 0;
}
????????這是一個C語言程序,定義了兩個宏:C和CPP,并在主函數(shù)中使用了#if和#ifndef預(yù)編譯指令。
????????#if !(defined(C) || defined(CPP))表示如果C和CPP中的宏都未定義,則執(zhí)行if語句內(nèi)的代碼,輸出"hello c || cpp"。但是由于C和CPP都被定義了,所以if語句的條件不成立,所以會執(zhí)行else語句內(nèi)的代碼,輸出"hello other"。因此,這個程序的輸出結(jié)果是"hello other"。
#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C)
#if defined (CPP)
printf("hello CPP\n");//這句話會被輸出
#endif
printf("hello C\n");//這句話會被輸出
#else
printf("hello other\n");
#endif
return 0;
}
????????這是一個C語言程序,其中使用了條件編譯指令。程序定義了兩個宏,分別為C和CPP。在main函數(shù)中,先判斷宏C是否被定義,如果被定義,則進(jìn)入C語言的條件編譯指令中。在這個指令中,又判斷宏CPP是否被定義,如果被定義,則輸出"hello CPP\n"。無論宏CPP是否被定義,都會輸出"hello C\n"。
????????如果宏C沒有被定義,則程序進(jìn)入另一個條件編譯指令中,輸出"hello other\n"。因此,運(yùn)行該程序,會輸出"hello CPP\n"和"hello C\n"。
#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C)
printf("hello C\n");
#elif defined (CPP)
printf("hello CPP\n");
#else
printf("hello other\n");
#endif
return 0;
}
????????這是一個C語言程序,其中定義了兩個宏C和CPP。在main函數(shù)中,同樣使用了條件編譯指令#if-elif-else-endif。在這個指令中,先判斷宏C是否被定義,如果被定義,則輸出"hello C\n"。如果宏C沒有被定義,再判斷宏CPP是否被定義,如果被定義,則輸出"hello CPP\n"。如果宏C和CPP都沒有被定義,則輸出"hello other\n"。
????????由于宏C和CPP都被定義了,因此運(yùn)行該程序會輸出"hello C\n"。
#if 和 #ifdef的區(qū)別
????????#if和#ifdef是C預(yù)處理中的條件編譯指令,它們的作用都是根據(jù)某個宏的定義情況來判斷編譯代碼的方式。
????????#if的語法形式為#if 常量表達(dá)式,它會首先對常量表達(dá)式進(jìn)行求值,如果表達(dá)式的值為真,則編譯這個#if與對應(yīng)的#endif之間的代碼,否則忽略這個#if與對應(yīng)的#endif之間的代碼。
#ifdef的語法形式為#ifdef 宏名,它用來判斷某個宏是否定義了。如果宏被定義了,則編譯#ifdef與對應(yīng)的#endif之間的代碼,否則忽略這個#ifdef與對應(yīng)的#endif之間的代碼。
????????它們的主要區(qū)別在于#if是對表達(dá)式的求值結(jié)果進(jìn)行判斷,可以進(jìn)行更加復(fù)雜的條件判斷,而#ifdef只是判斷宏是否被定義,不能進(jìn)行表達(dá)式求值。另外,由于#if可以進(jìn)行表達(dá)式求值,因此在某些情況下,#if比#ifdef會更加靈活和方便。
條件編譯和宏替換誰先執(zhí)行
宏替換先于條件編譯執(zhí)行。
????????在C語言中,預(yù)處理器會先對源代碼進(jìn)行宏替換,將源代碼中的宏名稱替換為相應(yīng)的宏定義,然后再對替換后的代碼進(jìn)行條件編譯。也就是說,條件編譯是在宏替換之后進(jìn)行的。這也就意味著,在條件編譯中對宏的定義或者值的改變,并不會影響到之前宏替換的結(jié)果。
在進(jìn)行宏替換時,預(yù)處理器會根據(jù)宏定義中的替換列表來進(jìn)行替換。如果宏定義中包含了其他宏的調(diào)用,那么預(yù)處理器會先對這些宏進(jìn)行替換,然后再對當(dāng)前宏進(jìn)行替換。這種替換過程會一直持續(xù)下去,直到不包含其他宏的調(diào)用為止。
????????總的來說,宏替換是在條件編譯之前進(jìn)行的,而且它是一個遞歸的過程,可以包含其他宏的調(diào)用,最終將源代碼中的所有宏替換為相應(yīng)的宏定義后,再對替換后的代碼進(jìn)行條件編譯。
條件編譯可以用來注釋代碼嗎?推不推薦?
????????條件編譯可以用來注釋代碼,但不是最佳實踐,因為它會影響到代碼的可讀性和可維護(hù)性。
????????在條件編譯中,使用了類似于`#if 0 ... #endif`的語句來注釋掉代碼,它會導(dǎo)致這段代碼被編譯器忽略掉,從而達(dá)到注釋的效果。如果這種語句對應(yīng)的條件值為假,則這段代碼將永遠(yuǎn)不會被編譯,從而達(dá)到注釋掉代碼的效果。
????????然而,使用條件編譯來注釋代碼會使得代碼難以閱讀,特別是在復(fù)雜的代碼環(huán)境中。因為代碼注釋完全可以通過標(biāo)準(zhǔn)注釋語法來實現(xiàn),這樣會更加清晰易懂,也更易于維護(hù)。而使用條件編譯來注釋代碼,會給讀代碼的人帶來很大的困擾,因為他們不得不去尋找代碼中存在的所有條件編譯語句,以了解到底有哪些代碼是被注釋掉的。
????????因此,推薦使用標(biāo)準(zhǔn)注釋語法來進(jìn)行注釋,并盡可能避免使用條件編譯來注釋掉代碼。這樣會使代碼更具可讀性和可維護(hù)性。
結(jié)論:條件編譯本質(zhì)是讓編譯器進(jìn)行代碼裁剪。
2.為何要有條件編譯?
文章來源:http://www.zghlxwxcb.cn/news/detail-461314.html
3. 條件編譯都在哪些地方用?
文章來源地址http://www.zghlxwxcb.cn/news/detail-461314.html
到了這里,關(guān)于learn_C_deep_14 (條件編譯的基本使用與理解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!