條件編譯指令語法
1. c++中條件編譯指令的使用
其實用的最多的是在頭編譯的條件編譯,很多頭編譯就有。比如我聲明一個test.h的頭文件
#ifndef TEST_H
#define TEST_H
//你要寫的代碼
#endif
這里用條件編譯主要是告訴編譯器,如果其他的地方沒有包含這個頭文件就包含這個頭文件,你可以試試,用兩個頭文件包含包含另外一個頭文件,如果沒有條件編譯就會出錯,有就不會出錯。
2. 條件編譯選項 什麼意思
一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件下才進行編譯,即對一部分內容指定編譯條件,這就是「條件編譯」。(conditional compile) 條件編譯語句排版時,需考慮以下三種位置: (1)條件編譯語句塊與函數定義體之間不存在相互嵌套(主要在(.h)文件中) ◆ 條件編譯關鍵字語句頂格左對齊; ◆ 所含的#include語句(塊) #define語句(塊)甚至是被嵌套下級條件編譯語句塊,按照語句塊嵌套的排版方式進行縮進排版 。 (2)條件編譯語句塊嵌套在函數體之外(主要在(.c)文件中) 這種情況下,條件編譯語句塊不影響函數體 ◆ 條件編譯關鍵字語句頂格左對齊; ◆ 所含的函數體定義無需縮進,依舊按照單個函數體定義的排版方式進行。 (3)條件編譯語句嵌套在函數體內 (主要在(.c)文件中) a)當條件編譯語句塊與被包語句所屬的語句塊之間沒有邏輯路徑交叉時,以下兩種方式均可 ◆ 按照語句塊嵌套方式進行縮進排版 (推薦); ◆ 條件編譯語句不影響原先語句塊排版,條件編譯語句與所包含的關鍵字語句塊左對齊 。 b)當條件編譯語句塊與被包語句所屬的語句塊之間存在邏輯路徑交叉時 ◆ 條件編譯語句頂格左對齊,其它語句按照正常順序排版。 條件編譯的形式如下所示(NNN、MMM等都是在某處已經定義為 1 或者 0 的): #if NNN statement1; #elif MMM statement2; #else statement3; #endif 條件編譯指令將決定那些代碼被編譯,而哪些是不被編譯的。可以根據表達式的值或者某個特定的宏是否被定義來確定編譯條件。 1.#if指令 #if指令檢測跟在製造另關鍵字後的常量表達式。如果表達式為真,則編譯後面的代碼,直到出現#else、#elif或#endif為止;否則就不編譯。 2.#endif指令 #endif用於終止#if預處理指令。 #define DEBUG 0 main() { #if DEBUG printf("Debugging\n"); #endif printf("Running\n"); } 由於程序定義DEBUG宏代表0,所以#if條件為假,不編譯後面的代碼直到#endif,所以程序直接輸出Running。 如果去掉#define語句,效果是一樣的。 3.#ifdef和#ifndef #define DEBUG main() { #ifdef DEBUG printf("yes\n"); #endif #ifndef DEBUG printf("no\n"); #endif } #if defined等價於#ifdef; #if !defined等價於#ifndef 4.#else指令 #else指令用於某個#if指令之後,當前面的#if指令的條件不為真時,就編譯#else後面的代碼。#endif指令將中指上面的條件塊。 #define DEBUG main() { #ifdef DEBUG printf("Debugging\n"); #else printf("Not debugging\n"); #endif printf("Running\n"); } 5.#elif指令 #elif預處理指令綜合了#else和#if指令的作用。 #define TWO main() { #ifdef ONE printf("1\n"); #elif defined TWO printf("2\n"); #else printf("3\n"); #endif } 程序很好理解,最後輸出結果是2。 6.其他一些標准指令 #error指令將使編譯器顯示一條錯誤信息,然後停止編譯。 #line指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。 #pragma指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息
3. C++常見條件編譯用法
條件編譯命令最常見的形式為:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。
其中#else部分也可以沒有,即:
#ifdef
程序段1
#endif
這里的「程序段」可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。
4. C++條件編譯指令
#if 是專門計算#define的值的。如:#include <iostream.h>void main(){ #define a 5#define b 6#if b==a cout<<'2'<<endl;#else cout<<'3'<<endl;#endif}那麼就會如你期望的輸出3而你沒有用#define定義a,b的宏那麼#if a==b 為真,因為a也未定義,b也未定義。未定義當然等於未定義羅。
5. C++ if()是不是條件編譯指令
if()屬於判斷語句,不是條件編譯指令。
與if類似的條件編譯指令為#if和#ifdef。
條件編譯指令屬於預編譯語句,即編譯器在執行編譯工作時,會第一步處理預編譯語句,之後再進行剩餘的編譯工作。
在c語言中,所有的預編譯語句都是以#開頭的,如#define, #undef,#if等等。
條件編譯指令包括以下幾項:
1 #if
當後續的參數為真時執行編譯。
2 #ifdef/#ifndef
#ifdef當後續的宏定義被定義時執行編譯。
#ifndef當後續的宏定義沒有被定義時執行編譯。
3 #elif
與C語言語句中的else if類似,與#if或#ifdef連用,當後續參數為真時執行編譯。
4 #endif
用於條件編譯結尾,表示條件編譯結束。
6. 條件編譯,該怎麼處理
條件編譯屬於三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變數重復定義的錯誤
條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。
#if指令的形式為:
#if 常量表達式
代碼塊
#endif
#if後面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。
7. 條件編譯的介紹
一般情況下,源程序中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件下才進行編譯,即對一部分內容指定編譯條件,這就是「條件編譯」(conditional compile)。條件編譯語句排版時,需考慮以下三種位置:1)條件編譯語句塊與函數定義體之間不存在相互嵌套(主要在(.h)文件中);2)條件編譯語句塊嵌套在函數體之外(主要在(.c)文件中);3)條件編譯語句嵌套在函數體內 (主要在(.c)文件中)。條件編譯指令將決定哪些代碼被編譯,而哪些是不被編譯的。可根據表達式的值或某個特定宏是否被定義來確定編譯條件。
8. 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
9. 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