❶ 條件編譯,ifdef條件,ifndef條件的區別是什麼
一般情況下,源程序中所有行都參加編譯。但是有時希望程序中一部分內容只在滿足一定條件是才進行編譯,也就是對這一部分內容指定編譯的條件,也就出現了條件編譯.
#ifdef 和 #ifndef 用法及意義其實跟判斷語句if是一樣的
但使用if語句目標程序長,因為所有語句都要進行編譯,運行時間長,因為運行時要對if語句進行測試
,而採用條件編譯,就可以減少編譯語句,從而減少目標程序的長度,減少運行時間。
❷ 【C語言】條件編譯:ifdef、ifndef怎麼念最好音標。
if'dif
if'noudif
❸ c語言中,什麼是條件編譯
條件編譯屬於三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變數重復定義的錯誤
條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。
#if指令的形式為:
#if 常量表達式
代碼塊
#endif
#if後面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。
#else被使用來標志#if的末尾和#else塊的開始。這是必須的,因為任何#if僅有一個#endif與之關聯。
#elif意指"else if",它形成一個if else if嵌套語句用於多種編譯選擇。#elif後面跟一個常量表達式,如果表達式是真,則編譯其後的代碼塊,不對其他#elif表達式進行檢測,否則順序測試下一塊。常見的形式如下:
形式1:
#ifdef 標識符
/*程序段 1*/
#else
/*程序段 2*/
#endif
它的作用是當標識符已經由#define定義過了,則編譯程序段1,否則編譯程序段2,也可以使用簡單形式
#ifdef 標識符
/*程序段1*/
#endif
形式2:
#ifndef 標識符
#define 標識符
/*程序段 1*/
#else
/*程序段 2*/
#endif
它的作用是當標識符沒有由#define定義過,則編譯程序段1,否則編譯程序段2 ,也可以使用簡單形式
#ifndef 標識符
#define 標識符
/*程序段 1*/
# endif
形式3:
#if 表達式
/*程序段 1*/
#else
*程序段 2*/
# endif
它的作用是 當「表達式」值為真時編譯程序段1。否則則編譯程序段2,也可以使用簡單形式
# if 表達式
/*程序段 1*/
# endif
形式4:
#if 表達式1
/*程序段 1*/
#elif 表達式2
/*程序段 2*/
............
#elif 表達式n
/*程序段n */
#endif
它的作用是當「表達式1」值為1時編譯程序段1,表達式2的值為真是編譯程序段2,否則依次順序判斷到表達式n。
最後,條件編譯的條件是一個常量表達式,支持邏輯與&&和或||運算。以上四種形式的條件編譯預處理結構都可以嵌套使用,
標識符: 在理論上來說可以是自由命名的,但每個頭文件的這個標識符都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h。
#ifndef _STDIO_H_
#define _STDIO_H_
/*程序段 */
#endif
❹ 請教高手關於頭文件條件編譯#ifndef的問題 下面的程序有哪位高手給解釋一下啊 各個層次關系 小弟看不懂
最外層的#ifdef是這個樣子:
#ifndef __MENU_H
#define __MENU_H
...
#endif /* __MENU_H */
這是為了確保menu.h只被包含一次。第二次包含時,由於__MENU_H已經被定義,整個文件的內容就被跳過了。
__cplusplus是個特殊的宏,只在C++程序中被定義。這樣,在C代碼中,看到的代碼是這個樣子的:
...
void Show_HomeScreen(void);
而在C++代碼中,看到的則是這個樣子:
extern "C" {
...
void Show_HomeScreen(void);
}
最主要的用處是函數被聲明為extern "C",也就是在目標文件中用C的方式進行編碼和查找。C的方式只有函數名,而C++的方式則把參數也編碼了進去,這樣才可能允許函數重載。比如,test(int)在C代碼里的符號名就是test,而在C++中則不同。在MSVC(在不同編譯器中不同)中是「?test@@YAXH@Z」。一個函數要同時在C和C++中使用,一般都回在頭文件聲明時放到一個extern "C"塊里。
❺ C++中#if和#ifdef區別
在你的例子中,是一樣的效果。
#ifdef 和 #if defined 的區別在於,後者可以組成復雜的預編譯條件,比如
#if defined (AAA) && defined (BBB)
xxxxxxxxx
#endif
#if defined (AAA) || VERSION > 12
xxxxxxxxx
#endif
而#ifdef 就不能用上面的用法,也就是說,當你要判斷單個宏是否定義時
#ifdef 和 #if defined 效果是一樣的,但是當你要判斷復雜的條件時,只能用 #if
❻ #ifndef是什麼
#ifndef是"if not defined"的簡寫,是宏定義的一種,它是可以根據是否已經定義了一個變數來進行分支選擇,一般用於調試等。
實際上確切的說這應該是預處理功能中三種(宏定義,文件包含和條件編譯)中的第三種——條件編譯。
作用:
條件指示符#ifndef的最主要目的是防止頭文件的重復包含和編譯。
條件編譯當然也可以用條件語句來實現, 但是用條件語句將會對整個源程序進行編譯,生成的目標代碼程序很長,而採用條件編譯,則根據條件只編譯其中的程序段1或程序段2,生成的目標程序較短。如果條件選擇的程序段很長,採用條件編譯的方法是十分必要的。
❼ #ifdef是不是不能和#elif連用
#ifdef和#elif是可以連用的。#ifdef和#elif連用,語法和if...else if語句一樣。
條件編譯區域以 #if、#ifdef 或 #ifndef 等命令作為開頭,以 #endif 命令結尾。條件編譯區域可以有任意數量的 #elif 命令,但最多一個 #else 命令。
#if defined的使用
#if defined (宏)代碼.#endif
這個#if後面接的是一個宏,意思是前面的宏定義裡面有沒有定義這個宏,如果定義了,編譯器就會編譯中間的代碼,如果沒有定義,那就不會編譯,不管這個宏定義的是什麼東西,對不對等。
#ifdef的使用
ifdef的使用和#if defined()的用法是一樣的。
ifndef又和#if !defined()的用法一樣(取反的意思)。
(7)條件編譯if和ifndef擴展閱讀
#if 和 #elif 命令
作為 #if 或 #elif 命令條件的表達式,必須是整數常量預處理器表達式。這與普通的整數常量表達式不同,主要區別在於:
(1) 不能在 #if 或 #elif 表達式中使用類型轉換運算符。
(2) 可以使用預處理運算符 defined。
(3) 在預處理器展開所有宏,並且計算完所有 defined 表達式之後,會使用字元 o 替換掉表達式中所有其他標識符或關鍵字。
(4) 表達式中所有帶符號值都具有 intmax_t 類型,並且所有無符號值都具有 uintmax_t 類型。字元常量也會受該規則的影響。intmax_t 和 uintmax_t 定義在頭文件 stdint.h 中。
(5) 預處理器會把字元常量和字元串字面量中的字元與轉義序列轉換成運行字元集中對應的字元。然而,字元常量在預處理器表達式和在後期編譯階段是否具有相同的值,取決於實現版本。
❽ C語言中條件編譯的作用
條件編譯屬於三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變數重復定義的錯誤
條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。
#if指令的形式為:
#if常量表達式
代碼塊
#endif
#if後面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。
#else被使用來標志#if的末尾和#else塊的開始。這是必須的,因為任何#if僅有一個#endif與之關聯。
#elif意指"else if",它形成一個if else if嵌套語句用於多種編譯選擇。#elif後面跟一個常量表達式,如果表達式是真,則編譯其後的代碼塊,不對其他#elif表達式進行檢測,否則順序測試下一塊。常見的形式如下:
形式1:
#ifdef標識符
/*程序段1*/
#else
/*程序段2*/
#endif
它的作用是當標識符已經由#define定義過了,則編譯程序段1,否則編譯程序段2,也可以使用簡單形式
#ifdef標識符
/*程序段1*/
#endif
形式2:
#ifndef標識符
#define標識符
/*程序段1*/
#else
/*程序段2*/
#endif
它的作用是當標識符沒有由#define定義過,則編譯程序段1,否則編譯程序段2 ,也可以使用簡單形式
#ifndef標識符
#define標識符
/*程序段1*/
#endif
形式3:
#if表達式
/*程序段1*/
#else
*程序段2*/
#endif
它的作用是 當「表達式」值為真時編譯程序段1。否則則編譯程序段2,也可以使用簡單形式
#if表達式
/*程序段1*/
#endif
形式4:
#if表達式1
/*程序段1*/
#elif表達式2
/*程序段2*/
............
#elif表達式n
/*程序段n*/
#endif
它的作用是當「表達式1」值為1時編譯程序段1,表達式2的值為真是編譯程序段2,否則依次順序判斷到表達式n。
最後,條件編譯的條件是一個常量表達式,支持邏輯與&&和或||運算。以上四種形式的條件編譯預處理結構都可以嵌套使用,
標識符: 在理論上來說可以是自由命名的,但每個頭文件的這個標識符都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h。
#ifndef_STDIO_H_
#define_STDIO_H_
/*程序段*/
#endif
❾ 關於單片機中#if,#else if 的用法
#if............
#else if...........這是預處理語句。
預處理就是在進行編譯的第一遍詞法掃描和語法分析之前所作的工作。說白了,就是對源文件進行編譯前,先對預處理部分進行處理,然後對處理後的代碼進行編譯。這樣做的好處是,經過處理後的代碼,將會變的很精短。在單片機中屬於條件編譯,也就是說當滿足條件,就將#if後面的語句進行編譯,否則,丟棄這些部分語句,編譯#else if後面的語句。
❿ #ifndef的用法
#ifndef是宏定義裡面的一種,用來防止防止頭文件的重復包含和編譯。
比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。
如果把頭文件的內容都放在#ifndef和#endif中,不管你的頭文件會不會被多個文件引用,你都要加上這個,就可以避免沖突的問題。
#ifndef可以根據是否已經定義了一個變數來進行分支選擇,一般用於調試等等.實際上確切的說這應該是預處理功能中三種(宏定義,文件包含和條件編譯)中的一種——條件編譯。 C語言在對程序進行編譯時,會先根據預處理命令進行「預處理」。C語言編譯系統包括預處理,編譯和鏈接等部分。
(10)條件編譯if和ifndef擴展閱讀:
#ifndef一般格式是這樣的:
#ifndef <標識>
#define <標識>
......
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個「標識」都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif