首頁 > 軟體

C語言宏定義的擴充套件定義講解

2022-12-27 14:00:51

1. 常數宏定義

使用c中的#define 來定義一個常數來表示一年有多少秒

#define SECONDS_PER_YEAR (606024*365)UL

求圓的周長:

#define D® (r + r) //使用D(5) * 3.14 -----> (5 + 5) * 3.14

2. 定義宏函數

在定義宏函數時,最後一個表示式的結果就是宏函數的返回值

格式:

​ #define 宏函數名(形參表) ({語句1;語句2;語句3…})

​ 形參沒有資料型別,只有引數名

請寫一個「標準」的宏MIN,這個宏輸入兩個引數並返回較大較小值
#include <stdio.h>
#define MIN(A,B)  ({A<B?A:B;})
//宏定義分成多行書寫,行尾必須加續行符 
#define MAX(A,B)  ({int ret;
                        if(A<B)
                            ret=B;
                        else    
                            ret=A;
                        ret;})
int main(int argc, char const *argv[])
{
    int min=MIN(100,200);
    printf("min value=%dn",min);
    int max=MAX(100,200);
    printf("max value=%dn",max);
    return 0;
}

3. 宏定義和#號結合

#可以將宏的引數轉換為一個字串

#include <stdio.h>
#define NAME "lisi"
#define NAME1(n)  n
#define NAME2(n)  #n
int main(int argc, char const *argv[])
{
	printf("%sn",NAME);   //------>printf("%sn","lisi");
	printf("%sn",NAME1(lisi));   //------>printf("%sn",lisi); //error
	printf("%sn",NAME2(lisi));   //------>printf("%sn","lisi"); //error
    return 0;
}

預處理之後的效果:

# 5 "test02.c"
int main(int argc, char const *argv[])
{
 printf("%sn","lisi");
 printf("%sn",lisi);
 printf("%sn","lisi");
    return 0;
}

4. 宏定義和兩個#結合

兩個#可以實現字串的拼接

// 將a和b代表的字串拼接生成一個新的字串
#define  type(a, b)     a##b

type(uint, _t)  ----> 預處理階段展開之後的結果 : uint_t

練習:int型、short型、char型的資料比較大小

#include <stdio.h>
#if 0
int max_int(int a,int b){
    return a>b?a:b;
}
short max_int(short a,short b){
    return a>b?a:b;
}
char max_int(char a,char b){
    return a>b?a:b;
}
#endif
//使用宏定義完成函數模板
#define MAX(T) T max_##T (T a,T b){return a>b?a:b;}
//使用宏定義,定義max_int max_short max_char函數
MAX(int)
MAX(short)
MAX(char)
#define max_value(T) max_##T
int main(int argc, char const *argv[])
{
    // printf("int max value =%d n",max_int(10000,300000));
    // printf("short max value =%d n",max_short(100,300));
    // printf("char max value =%c n",max_char('a','b'));
    printf("int max value =%d n",max_value(int)(10000,300000));
    printf("short max value =%d n",max_value(short)(100,300));
    printf("char max value =%c n",max_value(char)('a','b'));
    return 0;
}

預處理程式碼:

int max_int (int a,int b){return a>b?a:b;}
short max_short (short a,short b){return a>b?a:b;}
char max_char (char a,char b){return a>b?a:b;}
int main(int argc, char const *argv[])
{
    printf("int max value =%d n",max_int(10000,300000));
    printf("short max value =%d n",max_short(100,300));
    printf("char max value =%c n",max_char('a','b'));
    return 0;
}

5. 宏定義和do…while()的結合

使用場合:如果在宏定義階段,有多條語句,最後將c語句用do…while()包裹起來

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PRINT() printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
              printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
#define DBUG() do{printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
              printf("%s:%s:%dn",__FILE__,__func__,__LINE__);}while(0)
int main(int argc, const char *argv[])
{
    int a=100,b=200;
#if 0
    /*
        偵錯宏:
        __FILE__:檔名
        __func__:函數名
        __LINE__:當前行號
    */
    // if(a>b){
    //     printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
    //     printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
    // }else{
    //     printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
    //     printf("%s:%s:%dn",__FILE__,__func__,__LINE__);
    // }
    if(a>b){
        PRINT()
    }else{
        PRINT()
    }
#endif
#if 0
    //如果if或者else只有一條語句,可以省略{}
    //包括while,for迴圈語句都一樣
    if(a>b)
        PRINT()
    else
        PRINT()
    // if和else宏替換後,變成兩句,替換後語法錯誤,解決辦法就是使用宏定義和do....while結合
#endif
    // if和else宏替換後,變成兩句,替換後語法錯誤,解決辦法就是使用宏定義和do....while結合
    if(a>b)
        DBUG();
    else
        DBUG();
    return 0;
}

6. #ifdef…#else…#endif

格式:

#define 宏定義的名字

#ifdef 宏定義的名字

​ //如果宏定義被定義了,這段程式碼有效

#else

​ //如果宏定義沒被定義,這段程式碼有效

#endif

7. #ifndef…#else…#endif

格式:

#define 宏定義的名字

#ifndef 宏定義的名字

​ //如果宏定義沒被定義了,這段程式碼有效

#else

​ //如果宏定義被定義,這段程式碼有效

#endif

8. #if defined() … #else … #endif

----> 底層程式碼使用較多

格式:
#if defined(宏定義的名字)
	// 如果宏定義被定義了,則這段程式碼有效
#else
	// 如果宏定義沒有被定義,則這段程式碼有效
#endif 
#if !defined(宏定義的名字)
	// 如果宏定義沒有被定義,則這段程式碼有效
#else
	// 如果宏定義被定義了,則這段程式碼有效
#endif 
// #if defined可以進行邏輯運算
#if defined(宏定義的名字1) || defined(宏定義的名字2)
	// 以上兩個宏定義只要有一個定義了,則這段程式碼有效
#else
	// 以上兩個宏定義都沒有定義,則這段程式碼有效
#endif 
#if defined(宏定義的名字1) && defined(宏定義的名字2)
	// 以上兩個宏定義都被定義了,則這段程式碼有效
#else
	// 以上兩個宏定義只要有一個沒有定義,則這段程式碼有效
#endif 

到此這篇關於C語言宏定義的擴充套件定義講解的文章就介紹到這了,更多相關C語言宏定義內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com