C語言學習11:typedef和define區別,頭文件的使用以及 <>和「」區別,宏定義中#和##的用法,條件編譯,gcc和c99中宏定義使用printf和sprintf,條件編譯避免頭文件包含

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 
相關文章
相關標籤/搜索