1 條件include
如下 CODE
#ifndef MAIN_H_ #define MAIN_H_ 其它內(nèi)容 #endif 上面在看到頭文件時會看到 作用就是阻止這個頭文件被多次include 多次include就會出現(xiàn)重復的定義情況 所以需要在每個頭文件中都使用這個定義 如果還不是很了解要怎樣使用 可以看看 c的標準頭文件 如fcntl.h 2 條件編譯 如下 CODE
#ifdef _DEBUG printf("this debug info\n"); #endif 如果沒有定義_DEBUG宏的話 那么上面那一行是不會編譯進去的 但是定義了_DEBUG后 上面那行就會編譯進去 可以寫個簡單的程序測試 CODE
#include <stdio.h> int main() { #ifdef _DEBUG printf("hello world\n"); #else printf("no debug"); #endif return 0; } 第一次使用 gcc -D_DEBUG main.c 第二次使用 gcc main.c 運行兩次的結(jié)果看 3 定義為某個值 以便后面修改這個值時不用修改其它地方代碼 只要修改這個宏的定義就可以了 如一個軟件的多語言版本等 如下 CODE
#include <stdio.h> #define PRINT_STR "你好 DD" main(){ printf(PRINT_STR); return 0; } 編譯時 會把PRINT_STR代替成"你好 DD" 以后想修改時就方便了 另外也可以定義為函數(shù) #include <stdio.h> #ifdef _DEBUG #define A(x) a(x) #else #define A(x) b(x) #endif int a(int x) { return x+1; } int b(int x){ return x+100; } int main(){ printf ("A(10) value is %d",A(10)); return 0; } [/code] 其實也可以定義成 #define A a 的 但是 定義成A(x)后 只有A后面帶一個(x)類型的 編譯器才會執(zhí)行替換 比較安全 可以保證只替換函數(shù)而不替換變量 第四個 可變參數(shù)宏 有些時候定義一個宏來代替某個函數(shù) 但是這個函數(shù)是可變參數(shù)的話 那就需要考慮辦法了 定義方法如下 CODE
#define PRINT(...) printf(__VA_ARGS__) #include <stdio.h> int main(){ PRINT("%d %s %s",1,"吃飯了嗎 smile MM:)","\n"); return 0; } 第五個 宏組合 也就是## 和 #的用法 ## 是連接符號 連接兩個宏 #是把名字代替成字符串 如下 CODE
#define s5(a) supper_ ## a #include <stdio.h> void supper_printf(const char* p ) { printf("this is supper printf:\n%s\n",a); } int main() { s5(printf)("hello owrld"); return 0; } #用法如下 #include <stdio.h> #define s(p) #p int main(){ printf(s(p)"\n"); return 0; } 運行一下就知道了 |
|