1,typedef和define區別函數
#include <stdio.h> #define INT32 int #define COUNT 10 //typedef 是編譯器關鍵字,和#define是徹底不一樣的 //typede 是會令編譯器作類型推導, //#define 是預處理關鍵字,預處理後即處理完畢 typedef int int32; //帶參數宏(按照參數進行宏替換) #define max(a,b) (((a)>(b))?(a):(b)) int main(void) { int i; INT32 a=3; int32 b=5; int m; for(i=0;i<COUNT;i++) printf("%d ",i); putchar('\n'); m=max(a+3,b-1); printf("m=%d\n ",m); return 0; }
結果:this
will@will-laptop:~/ex/10$ ./a.out 0 1 2 3 4 5 6 7 8 9 m=6
2,頭文件的使用以及<>和「」的區別spa
C文件: //#include<>搜索系統默認目錄(/usr/include /usr/local/include gcc指定目錄) //#include「」搜索源文件當前目錄,而後搜索系統默認目錄 //<>或者「」內是頭文件路徑(相對路徑 /絕對路徑) #include </usr/include/stdio.h> #include "headerfile/123.h" int main(void) { printf("hello!\n"); printf("max=%d\n",max(6,7)); return 0; } H文件:123.h #define max(a,b) ( (a>b)?(a):(b))
結果:debug
will@will-laptop:~/ex/10$ ./a.out hello! max=7
3,宏定義中#和##的用法code
#include<stdio.h> //#將傳入參數名轉換成加上「」的參數名字符串 #define tostring(s) #s //##鏈接字符串 #define stringcat(s1,s2) s1##s2 #define stringcat1(s1,s2) s1+s2 int main(void) { printf("%s\n",tostring(12345)); printf("%d\n",stringcat(123,456)); printf("%d\n",stringcat1(123,456)); return 0; }
結果:blog
will@will-laptop:~/ex/10$ ./a.out 12345 123456 579
4,條件編譯字符串
#include <stdio.h> //#define DEBUG //定義與未定義產生不一樣的結果,三個語句就是一套 //就是#ifdef #else #endif int main(void) { #ifdef DEBUG printf("this is a debug version!\n"); #else printf("this is a release version!\n"); #endif #if 1 printf("macro condition is true!\n"); #else printf("macro condition is false\n"); #endif return 0; }
結果:編譯器
will@will-laptop:~/ex/10$ ./a.out this is a release version! macro condition is true!
5,gcc和c99宏定義中使用printf和sprintf,string
#include <stdio.h> //"調用"宏時,變參部分參數不能爲空 //GCC擴展功能 #define debug(msg,args...) \ printf(msg,args) //C99 的用法 #define debug1(msg,...) \ printf(msg,__VA_ARGS__) //"調用"宏時,變參部分參數能夠爲空 //GCC擴展功能 #define info(msg,args...) \ fprintf(stderr,msg,##args) //C99 的用法 #define info1(msg,...) \ fprintf(stderr,msg,##__VA_ARGS__) int main(void) { int a=3,b=5; debug("a=%d,b=%d\n",a,b); debug1("a=%d,b=%d\n",a,b); printf("----------------------------\n"); info("12312312312312312\n"); info1("a=%d,b=%d\n",a,b); return 0; }
結果:it
will@will-laptop:~/ex/10$ ./a.out a=3,b=5 a=3,b=5 ---------------------------- 12312312312312312 a=3,b=5
6,條件編譯避免頭文件包含
//條件編譯的應用 //防止頭文件包含 //若是出現兩個頭文件都包含一樣的一個頭文件就須要用到這個東西 #ifdef _HEADER_PROTECT_H_ #define _HEADER_PROTECT_H_ //中間能夠放你的文件 #endif /*_HEADER_PROTECT_H_*/
7,宏定義實現函數功能
#include <stdio.h> //宏定義的高級應用 #define swap(a,b) do { \ typeof(a) __t; \ //typeof能夠跟變量和表達式,取變量和表達式值的類型 __t=a; \ a=b; \ b=__t; \ }while(0) int main(void) { int a=3,b=5; //typedef:gcc typeof(a) flag=1; printf("before swap:a=%d,b=%d\n",a,b); if(flag) swap(a,b); else printf("no swap\n"); printf("=====================\n"); printf("after swap: a=%d,b=%d\n",a,b); return 0; }
結果:
will@will-laptop:~/ex/10$ ./a.out before swap:a=3,b=5 ===================== after swap: a=5,b=3