91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中#define在多行宏定義出錯的原因是什么

發布時間:2023-02-24 17:38:18 來源:億速云 閱讀:147 作者:iii 欄目:開發技術

這篇文章主要介紹了C語言中#define在多行宏定義出錯的原因是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C語言中#define在多行宏定義出錯的原因是什么文章都會有所收獲,下面我們一起來看看吧。

    C語言中#define在多行宏定義出錯的原因

    1.第一種錯誤

    #include<stdio.h>
    #define echange(a,b) {\/*宏定義中允許包含多行命令的情形,此時必須在最右邊加上"\"*/
     int t;\
     t=a;\
     a=b;\
     b=t;\
    }
    main()
    {
     int c, d;
     c = 2;
     d = 3;
     printf("%d %d\n", c, d);
     echange(c,d)
     printf("%d %d\n", c, d);
     return 0;
    }

    在用#define進行多行宏定義時,注釋要放在"\"之前

    2.第二種錯誤

    #include<stdio.h>
    #define echange(a,b) {/*宏定義中允許包含兩道衣裳命令的情形,此時必須在最右邊加上"\"*/\
     int t;\
     t=a;\
     a=b;\
     b=t;\
    }/*在最后一行多加了一個"\"*/\
    main()
    {
     int c, d;
     c = 2;
     d = 3;
     printf("%d %d\n", c, d);
     echange(c,d)
     printf("%d %d\n", c, d);
     return 0;
    }

    在用#define進行多行宏定義時,在最后一行加上"\“,我們使用#define進行多行定義時,默認最后一個”\“的下一行也屬于宏定義范圍,去掉最后一行的”\"即可

    以下是代碼的正確形式

    #include<stdio.h>
    #define echange(a,b) {/*宏定義中允許包含兩道衣裳命令的情形,此時必須在最右邊加上"\"*/\
     int t;\
     t=a;\
     a=b;\
     b=t;\
    }
    main()
    {
     int c, d;
     c = 2;
     d = 3;
     printf("%d %d\n", c, d);
     echange(c,d)
     printf("%d %d\n", c, d);
     return 0;
    }

    使用#define宏定義的幾個小技巧

    1.調試開關

    有時候編寫程序時為方便查找錯誤,會在很多地方加上串口打印語句直觀查看程序哪里出錯。

    但是,串口的輸出是需要時間的,在項目基本完成時,就需要將這些打印關閉,但是一行一行的注釋掉費時費力,不現實。

    這時可以使用宏來當做一個"開關",直接操作這個宏就可以實現打印的開關,例如:

    //#define    DEBUG(...)
    #define        DEBUG    printf

    另外,還可以使用幾個預定義的宏進行輔助:

    __FILE__            // 文件
    __FUNCTION__        // 函數
    __LINE__            // 行號
    
    DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

    2.條件編譯

    當程序為了適配更多不同的環境時,還可以使用條件宏來選擇不同的代碼模塊:

    #if 1
        printf("Hello!\n");
    #else
        printf("Hi!\n");
    #endif

    3.宏實現函數

    交換兩個數:

    #define swap(a,b)     ((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b))

    比較兩個數并且返回最小的數:

    #define MIN(a,b)     ((a)<(b)?(a):(b))

    求數組元素個數:

    #define LENGTH(array)    (sizeof(array) / sizeof(array[0]))

    4.跨行宏定義

    #define    SWAP(a,b)    do { \
                            int t = 0;\
                            t = a; \
                            a = b; \
                            b = t; \
                        } while(0)

    細心的你可能已經注意到以上宏末尾都沒有帶分號“;”

    5.防止頭文件被重復包含

    #ifndef __TEST_H 
    #define __TEST_H 
        // 頭文件內容 
    #endif

    6.帶參宏與帶參函數的區別

    • 1.宏會在編譯器在對源代碼進行編譯的時候進行簡單替換,不會進行任何邏輯檢測,即簡單代碼復制而已;

    • 2.宏進行定義時不會考慮參數的類型;

    • 3.參數宏的使用會使具有同一作用的代碼塊在目標文件中存在多個副本,即會增長目標文件的大小;

    • 4.參數宏的運行速度會比函數快,因為不需要參數壓棧/出棧操作;

    • 5.參數宏在定義時要多加小心,多加括號;

    • 6.函數只在目標文件中存在一處,比較節省程序空間;

    • 7.函數的調用會牽扯到參數的傳遞,壓棧/出棧操作,速度相對較慢;

    • 8.函數的參數存在傳值和傳地址(指針)的問題,參數宏不存在;

    7.注意事項

    • 1.宏定義不會對引號內的參數進行替換;

    • 2.若要替換,可以在參數前面加上&rsquo;#&rsquo;轉換成“字符串”,如:

    #define dprint(expr) printf(#expr " = %d\n", expr)

    使用dprint(x/y)就被替換成:

    printf("x/y" " = %g\n", x/y);

    printf("x/y = %g\n", x/y);

    關于“C語言中#define在多行宏定義出錯的原因是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C語言中#define在多行宏定義出錯的原因是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    崇明县| 广昌县| 阿拉善盟| 汝南县| 临澧县| 民权县| 汝城县| 余姚市| 天津市| 荥经县| 太仆寺旗| 渝北区| 山东| 岑巩县| 吉木萨尔县| 榆树市| 安义县| 巴南区| 石河子市| 汾西县| 岳西县| 南宁市| 天全县| 托克逊县| 北辰区| 安泽县| 高雄县| 衡水市| 沁源县| 伊宁县| 紫金县| 宜阳县| 北安市| 龙胜| 汶上县| 灌云县| 昭苏县| 平乐县| 房山区| 齐河县| 陇川县|