------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------
C語言預處理總結
所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和文法分析)之前所作的工作。預處理是C語言的一個重要功能, 它由預處理程式負責完成。當對一個源檔案進行編譯時, 系統将自動引用預處理程式對源程式中的預處理部分作處理, 處理完畢自動進入對源程式的編譯。C語言提供提供了宏定義、條件編譯和檔案包含三種預處理指令。合理地使用預處理功能編寫的程式便于閱讀、修改、 移植和調試,也有利于子產品化程式設計。
1.預處理
1>預處理都是以#開頭的
2>預處理指令主要有三種,分别是
(1)宏定義
(2)條件編譯
(3)檔案包含
3>預處理指令在代碼翻譯為0,1之前執行
4>預處理指令的書寫位置是随意的,但是預處理指令也有作用域,是從編寫指令的那一行代碼開始一直檔案結束
2.宏定義
2.1 宏定義: #define 宏名 值
宏名一般大寫,如#define COUNT 5
#include<stdio.h>
#define COUNT 5
int main()
{
//int ages[COUNT] = {15, 23, 27, 29, 20};
int ages[COUNT] = {14,22,23,25,11};
int i;
for(i = 0;i<COUNT;i++)
{
printf("ages[%d] = %d\n",i,ages[i]);
}
int a = COUNT;
printf("a = %d\n",a);
#undef COUNT
//int b = COUNT;
//printf("b = %d\n",b);
return 0;
}
從上面的代碼可以看出,定義的宏COUNT 從#define COUNT 一直到#undef COUNT 宏是有效的。用上述的程式周遊數組,會輸出全部的數組元素。在編譯時,編譯器會把所有的COUNT (嚴格意義上來說是從定義到#undef )替換為對應的值,在此處替換5。而本程式的最後兩句會報錯,原因是#udef之後宏定義失效,會提示未定以的變量變量COUNT。
2.2 宏定義注意
1>宏名一般用大寫或者以k開頭,變量名一般小寫
2>宏的在作用域内,一直有效,直到檔案結束或者遇到#undef辨別結束
3>宏隻是文本的替換并沒有參與運算,在定義有參數的宏時,一定要嚴謹
4>帶參數的宏定義執行效率高(宏在編譯時直接進行文本替換,而函數實在程式運作時執行的)
<span style="font-size:18px;">#include<stdio.h>
//不嚴謹的宏定義 sum(2+3,1+6) *sum(2+3,1+6) ==2+3+1+6*2+3+1+6
//#define sum(a,b) a+b
#define sum(a,b) ((a)+(b))
#define squar(a) ((a)*(a))
int main()
{
int c = sum(2,5)*sum(3,5);
printf("c = %d\n",c);
int d = squar(3+5+6);
printf("d = %d\n",d);
return 0;
}</span>
3.條件編譯
條件編譯主要有#if 條件,#if defined (條件)#endif以及#if!def 條件 #endif.
3.1第一種條件編譯指令
文法:
#if d條件1
......code.....
#elif 條件2
........code.....
..................
#elif 條件n
........code.....
#else
........code.....
#endif
最後的#endif不要漏掉,不然會包錯誤,提示沒有}.。
錯誤提示如下:
03-條件編譯.c: In function ‘main’: 03-條件編譯.c:34:0: error: unterminated #elif #if(10==COUNT) ^ 03-條件編譯.c:37:7: error: expected declaration or statement at end of input } ^
由于是預處理指令,這裡的條件是宏定義。
<span style="font-size:18px;">#include<stdio.h>
#define COUNT 5
int main()
{
#ifdef COUNT
printf("hahh\n");
#endif
#ifndef COUNT
printf("Heheh\n");
#endif
/*
#if defined COUNT
printf("Haha!\n");
#endif
#if !defined COUNT
printf("Hehehe!\n");
#endif
*/
/*
//int COUNT= 10;
#if(10==COUNT)
{
printf("a = 10\n");
}
#elif(5==COUNT)
{
printf("a = 5\n");
}
#else
{
printf("a為其它值\n");
}
#endif
*/
/*
03-條件編譯.c: In function ‘main’:
03-條件編譯.c:34:0: error: unterminated #elif
#if(10==COUNT)
^
03-條件編譯.c:37:7: error: expected declaration or statement at end of input
}
^
*/
/*
int a = 10;
if(10==a)
{
printf("a = 10\n");
}
else if(5==a)
{
printf("a = 5\n");
}
else
{
printf("a為其它值\n");
}
*/
return 0;
}</span>
3.2 #if defined MAX
......code1........
#endif
#if !defined Max
.....code2.....
#endif
假如程式中定義了宏Max則把code1編譯進去,否則編譯code2。
3.3 #ifdef A
...code1...
#endif
#ifndef A
.....code2.....
#endif
作用和上面的相同,定義宏編譯code1,否則編譯code2。
3.4條件編譯使用注意
1>條件編譯條件一般為宏
2>條件編譯寫#if後,一定要加上#endif,不然會報上述的錯誤
4.檔案包含
4.1檔案包含一般用#include指令
在C語言中,同一檔案可以包含多次,會增加編譯負擔,可以通過和條件編譯指令結合,讓多次同一檔案包含隻編譯一次。代碼如下:
<span style="font-size:18px;"> #ifdef _STUD_H_
#define _STUD_H_
int sum(int a,int b);
#endif</span>
4.2檔案包含注意
1>#inlcude後面 <>表示是系統自帶的檔案,""表示是自己定義的檔案
2>不允許循環包含,如A 包含b,b又包含A
------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------