字符串的輸入輸出
puts函數只需要給出字符串參數的地址
/**put_out.c---使用puts()*/#include<stdio.h>#define DEF "i am a #define string"int main(void){ char str1[80]="An array was initialized to me."; const char *str2="A pointer was initialized to me."; puts("I'm an argument to puts()."); puts(DEF); puts(str1); puts(str2); puts(&str1[5]);//從數組下標第五個開始輸出 puts(str2+4); return 0;}puts()顯示字符串時自動在其后添加一個換行符翻譯程序的第一步首先把源代碼中出現的字符映射到源字符集
明顯常量#define 的用符號#開頭,ANSI標準允許#前有空格或制表符,而且該標準還允許在#和指令的其余部分之間有空格,并且要求#和指令的其余部分不能有空格。
指令的定義域從指令的開始直到文件的末尾 定義符號常量或明顯常量預處理器指令從#開始,到其后第一個換行符為止,指令的長度限于一行代碼
/*簡單的預處理器的例子*/#include<stdio.h>#define TWO 2#define OW "Consistency is the last refuge of the unimagina/tive. -Oscar Wilde" /*反斜線把這個定義延續到下一行*/#define FOUR TWO*TWO#define PX PRintf("X is %d./n",x)#define FMT "X is %d./n"int main(void){ int x=TWO; PX; x=FOUR; printf(FMT,x); printf("%s/n",OW); printf("TWO:OW/n"); return 0;}每個#define行有三部分組成 第一部分指令為#define自身。第二部分為所選擇的縮略語,這些縮略語稱為宏 宏的名字之間不允許有空格,而且必須遵循命名規則:只能使用字母數字下劃線(第一個不能用數字開頭)。第三部分稱為替換列表或主體,從宏變為最終的替換文本的過程稱為宏展開#define PX printf("x is %d./n",x);
預處理 宏 主體
預處理器不進行計算,他只是按照指令進行文字替換操作
宏定義中可以含有其他宏
語言符號
系統把宏的主體當作語言符號(token)類型字符串,而不是字符型字符串
在#define中使用參數 ,可以創建外形和作用都相似的類函數宏,宏的參數也用圓括號括起來
下面是一個類函數宏定義的示例:
#define SQUARE(x) x*x
在程序中可以這樣使用 z=SQUARE(2); //z=4
/**mac_arg.c 帶有參數的宏*/#include<stdio.h>#define SQUARE(x) x*x#define PR(X) printf("The result is %d./n",X)int main(void){ int x=4; int z; printf("x=%d/n",x); z=SQUARE(x); printf("Evluating SQUARE(x):"); PR(z); z=SQUARE(2); printf("Evluating SQUARE(2):"); PR(z); printf("Evluating SQUARE(x+2):"); PR(SQUARE(2+x)); printf("Evluating 100/SQUARE(2):"); PR(100/SQUARE(2)); printf("x is %d./n",x); printf("Evluating SQUARE(++x):"); PR(SQUARE(++x)); printf("After incrementing,x is %x./n",x); return 0;}typedef簡介
typedef工具是一種高級數據特性,他使用戶能夠為某一類型創建用戶的名字,與#define有三個不同之處
與define不同,typedef給出的符號名稱僅限于對類型,而不是對值。解釋由編譯器進行,而不是預處理器執行 雖然他的范圍有限,但在其受限范圍內,typedef比#define靈活 該定義如果是在一個函數的內部,那么他的作用域就是局部,定義在函數的外部他就是全局作用域
|
新聞熱點
疑難解答