C程式的執行包括編譯和連結兩個階段,其實在編譯之前預處理器首先要進行預處理指令進行操作(#include檔案包含指令),將處理完產生的一個新的原始檔進行編譯。
注意:1.所有的預處理指令都以符號“#”開頭的,並且不需要分號(;)結尾.
2.預處理指令可以出現在程式的任何位置,它的作用範圍是從它出現的位置到結尾結束.(我習慣把它寫在源程式的開頭,這樣會作用整個源程式檔案).
C語言提供預處理指令主要有:1.宏定義、2.檔案包含、3.條件編譯.
宏定義分為:1.不帶引數的宏定義
2.帶引數的宏定義.
2.1.不帶引數的宏定義:
#define 宏名 字串(可以是其他的)
#define PI 3.14 宏名一般用大寫,小寫也不會錯誤。
#define R 10
#define S 2*PI*R 在另一個宏裡面引用上面的宏
作用:它的作用是在編譯處理時,將源程式中所有的“宏名”替換成右邊的“字串”,常用來定義常量,相比定義成全域性變數或函式效率較高。
#include<stdio.h>
#define PI 3.14
float girth(float redius){
return 2 * PI *redius;
}
int main(){
float g = girth(2);
printf("周長:%f",g);
return 0;
周長:12.560000
注意:1.如果用雙引號擴起來的字串內的字元,不會進行宏替換.
char *s = "RadioPI"; //PI不會被替換3.14
2.在編譯預處理用字串替換宏名時,不做語法檢查,只是簡單的字串替換。 只有在編譯的時候才對已經展開的宏名進行語法檢查。
3.宏名的有效範圍是從定義位置到檔案結束,如果需要終止宏定義的作用域,可以使用 #undef 宏名 .
//作用域
#undef PI
#define 宏名(引數列表)字串.
作用:在編譯預處理時,將源程式中所有的宏名替換成字串,並且將 “字串中的引數” 用 “宏名(右邊引數列表)” 中的引數替換。
#define average(a,b) (a+b)/2
int a = average(10,4);
printf("平均值:%d",a);
average(10,4)替換成 int a = (10+4)/2;
平均值:14
注意:1.宏名和引數列表之間不能有空格,否則空格後面的 所有字串都 作為 被替換的字串。
2.帶引數的宏在展開時,只作為簡單的字元和引數替換,不進行如何操作。所以在定義宏時,一般用小括號括住字串的引數.
3.計算結果最好也用括號括起來
C程式的執行包括編譯和連結兩個階段,其實在編譯之前預處理器首先要進行預處理指令進行操作(#include檔案包含指令),將處理完產生的一個新的原始檔進行編譯。
注意:1.所有的預處理指令都以符號“#”開頭的,並且不需要分號(;)結尾.
2.預處理指令可以出現在程式的任何位置,它的作用範圍是從它出現的位置到結尾結束.(我習慣把它寫在源程式的開頭,這樣會作用整個源程式檔案).
C語言提供預處理指令主要有:1.宏定義、2.檔案包含、3.條件編譯.
宏定義分為:1.不帶引數的宏定義
2.帶引數的宏定義.
2.1.不帶引數的宏定義:
#define 宏名 字串(可以是其他的)
#define PI 3.14 宏名一般用大寫,小寫也不會錯誤。
#define R 10
#define S 2*PI*R 在另一個宏裡面引用上面的宏
作用:它的作用是在編譯處理時,將源程式中所有的“宏名”替換成右邊的“字串”,常用來定義常量,相比定義成全域性變數或函式效率較高。
#include<stdio.h>
#define PI 3.14
float girth(float redius){
return 2 * PI *redius;
}
int main(){
float g = girth(2);
printf("周長:%f",g);
return 0;
}
周長:12.560000
注意:1.如果用雙引號擴起來的字串內的字元,不會進行宏替換.
char *s = "RadioPI"; //PI不會被替換3.14
2.在編譯預處理用字串替換宏名時,不做語法檢查,只是簡單的字串替換。 只有在編譯的時候才對已經展開的宏名進行語法檢查。
3.宏名的有效範圍是從定義位置到檔案結束,如果需要終止宏定義的作用域,可以使用 #undef 宏名 .
#define PI 3.14
//作用域
#undef PI
#define 宏名(引數列表)字串.
作用:在編譯預處理時,將源程式中所有的宏名替換成字串,並且將 “字串中的引數” 用 “宏名(右邊引數列表)” 中的引數替換。
#include<stdio.h>
#define average(a,b) (a+b)/2
int main(){
int a = average(10,4);
printf("平均值:%d",a);
return 0;
}
average(10,4)替換成 int a = (10+4)/2;
平均值:14
注意:1.宏名和引數列表之間不能有空格,否則空格後面的 所有字串都 作為 被替換的字串。
2.帶引數的宏在展開時,只作為簡單的字元和引數替換,不進行如何操作。所以在定義宏時,一般用小括號括住字串的引數.
3.計算結果最好也用括號括起來