預編譯語句中#與##的作用
# 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首個參數返回為一個帶引號的字符串. 例如, 命令
#define to_string( s ) # s
將會使編譯器把以下命令
cout << to_string( Hello World! ) << endl;
理解為
cout << "Hello World!" << endl;
使用##連結##前后的內容. 例如, 命令
#define concatenate( x, y ) x ## y
int xy = 10;
將會使編譯器把
cout << concatenate( x, y ) << endl;
解釋為
cout << xy << endl;
理所當然,將會在標準輸出處顯示'10'.
預編譯SQL語句的使用問題
*(index,Value);本來就是設定值的。
建議設定字段還是使用+。String List
}。
C語言提供的預編譯處理命令主要有哪三種
幾個預編譯指令的用法 預處理過程掃描源代碼,對其進行初步的轉換,產生新的源代碼提供給編譯器。
可見預處理過程先于編譯器對源代碼進行處理。在C語言中,并沒有任何內在的機制來完成如下一些功能:在編譯時包含其他源文件、定義宏、根據條件決定編譯時是否包含某些代碼。
要完成這些工作,就需要使用預處理程序。盡管在目前絕大多數編譯器都包含了預處理程序,但通常認為它們是獨立于編譯器的。
預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,并對源代碼進行響應的轉換。預處理過程還會刪除程序中的注釋和多余的空白字符。
預處理指令是以#號開頭的代碼行。#號必須是該行除了任何空白字符外的第一個字符。
#后是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字符。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。
下面是部分預處理指令: 指令 用途 # 空指令,無任何效果 #include 包含一個源代碼文件 #define 定義宏 #undef 取消已定義的宏 #if 如果給定條件為真,則編譯下面代碼 #ifdef 如果宏已經定義,則編譯下面代碼 #ifndef 如果宏沒有定義,則編譯下面代碼 #elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼 #endif 結束一個#if……#else條件編譯塊 #error 停止編譯并顯示錯誤信息一、文件包含 #include預處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個被包含的文件中還可以包含其他文件。
標準C編譯器至少支持八重嵌套包含。 預處理過程不檢查在轉換單元中是否已經包含了某個文件并阻止對它的多次包含。
這樣就可以在多次包含同一個頭文件時,通過給定編譯時的條件來達到不同的效果。例如: #define AAA #include "t.c" #undef AAA #include "t.c" 為了避免那些只能包含一次的頭文件被多次包含,可以在頭文件中用編譯時條件來進行控制。
例如: #ifndef MY_H #define MY_H …… #endif 在程序中包含頭文件有兩種格式: #include
第二種方法是用雙引號把頭文件括起來。這種格式告訴預處理程序在當前被編譯的應用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。
采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應用程序是在它們自己的私有子目錄下的。一個應用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。
采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區別出一組公共的頭文件。二、宏 宏定義了一個代表特定內容的標識符。
預處理過程會把源代碼中出現的宏標識符替換成宏定義時的值。宏最常見的用法是定義代表某個值的全局符號。
宏的第二種用法是定義帶參數的宏,這樣的宏可以象函數一樣被調用,但它是在調用語句處展開宏,并用調用時的實際參數來代替定義中的形式參數。 1.#define指令 #define預處理指令是用來定義宏的。
該指令最簡單的格式是:首先神明一個標識符,然后給出這個標識符代表的代碼。在后面的源代碼中,就用這些代碼來替代該標識符。
這種宏把程序中要用到的一些全局值提取出來,賦給一些記憶標識符。 #define MAX_NUM 10 int array[MAX_NUM]; for(i=0;i 程序中可以多次使用這個值。作為一種約定,習慣上總是全部用大寫字母來定義宏,這樣易于把程序紅的宏標識符和一般變量標識符區別開來。 如果想要改變數組的大小,只需要更改宏定義并重新編譯程序即可。 宏表示的值可以是一個常量表達式,其中允許包括前面已經定義的宏標識符。 例如: #define ONE 1 #define TWO 2 #define THREE (ONE+TWO) 注意上面的宏定義使用了括號。盡管它們并不是必須的。 但出于謹慎考慮,還是應該加上括號的。例如: six=THREE*TWO; 預處理過程把上面的一行代碼轉換成: six=(ONE+TWO)*TWO; 如果沒有那個括號,就轉換成six=ONE+TWO*TWO;了。 宏還可以代表一個字符串常量,例如: #define VERSION "Version 1.0 Copyright(c) 2003" 2.帶參數的#define指令 帶參數的宏和函數調用看起來有些相似。看一個例子: #define Cube(x) (x)*(x)*(x) 可以時任何數字表達式甚至函數調用來代替參數x。 這里再次提醒大家注意括號的使用。宏展開后完全包含在一對括號中,而且參數也包含在括號中,這樣就保證了宏和參數的完整性。 看一個用法: int num=8+2; volume=Cube(num); 展開后為(8+2)*(8+2)*(8+2); 如果沒有那些括號就變為8+2*8+2*8+2了。 下面的用法是不安全的: volume=Cube(num++); 如果Cube是一個函數,上面的寫法是可以理解的。 但是,因為Cube是一個宏,所以會產生副作用。這里的擦書不是簡單的表達式,它們將產生意想不到的結果。 它們展開后是這樣的: volume=(num++)。