欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中#define在多行宏定義出錯(cuò)的原因及分析

 更新時(shí)間:2023年02月24日 16:02:51   作者:倒在路上的羊  
這篇文章主要介紹了C語言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

1.第一種錯(cuò)誤

#include<stdio.h>
#define echange(a,b) {\/*宏定義中允許包含多行命令的情形,此時(shí)必須在最右邊加上"\"*/
?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進(jìn)行多行宏定義時(shí),注釋要放在"\"之前

2.第二種錯(cuò)誤

#include<stdio.h>
#define echange(a,b) {/*宏定義中允許包含兩道衣裳命令的情形,此時(shí)必須在最右邊加上"\"*/\
?int t;\
?t=a;\
?a=b;\
?b=t;\
}/*在最后一行多加了一個(gè)"\"*/\
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進(jìn)行多行宏定義時(shí),在最后一行加上"\“,我們使用#define進(jìn)行多行定義時(shí),默認(rèn)最后一個(gè)”\“的下一行也屬于宏定義范圍,去掉最后一行的”\"即可

以下是代碼的正確形式

#include<stdio.h>
#define echange(a,b) {/*宏定義中允許包含兩道衣裳命令的情形,此時(shí)必須在最右邊加上"\"*/\
?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宏定義的幾個(gè)小技巧

1.調(diào)試開關(guān)

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

但是,串口的輸出是需要時(shí)間的,在項(xiàng)目基本完成時(shí),就需要將這些打印關(guān)閉,但是一行一行的注釋掉費(fèi)時(shí)費(fèi)力,不現(xiàn)實(shí)。

這時(shí)可以使用宏來當(dāng)做一個(gè)"開關(guān)",直接操作這個(gè)宏就可以實(shí)現(xiàn)打印的開關(guān),例如:

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

另外,還可以使用幾個(gè)預(yù)定義的宏進(jìn)行輔助:

__FILE__?? ??? ??? ?// 文件
__FUNCTION__?? ??? ?// 函數(shù)
__LINE__?? ??? ??? ?// 行號

DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

2.條件編譯

當(dāng)程序?yàn)榱诉m配更多不同的環(huán)境時(shí),還可以使用條件宏來選擇不同的代碼模塊:

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

3.宏實(shí)現(xiàn)函數(shù)

交換兩個(gè)數(shù):

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

比較兩個(gè)數(shù)并且返回最小的數(shù):

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

求數(shù)組元素個(gè)數(shù):

#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)

細(xì)心的你可能已經(jīng)注意到以上宏末尾都沒有帶分號“;”

5.防止頭文件被重復(fù)包含

#ifndef __TEST_H?
#define __TEST_H?
?? ?// 頭文件內(nèi)容?
#endif

6.帶參宏與帶參函數(shù)的區(qū)別

  • 1.宏會(huì)在編譯器在對源代碼進(jìn)行編譯的時(shí)候進(jìn)行簡單替換,不會(huì)進(jìn)行任何邏輯檢測,即簡單代碼復(fù)制而已;
  • 2.宏進(jìn)行定義時(shí)不會(huì)考慮參數(shù)的類型;
  • 3.參數(shù)宏的使用會(huì)使具有同一作用的代碼塊在目標(biāo)文件中存在多個(gè)副本,即會(huì)增長目標(biāo)文件的大??;
  • 4.參數(shù)宏的運(yùn)行速度會(huì)比函數(shù)快,因?yàn)椴恍枰獏?shù)壓棧/出棧操作;
  • 5.參數(shù)宏在定義時(shí)要多加小心,多加括號;
  • 6.函數(shù)只在目標(biāo)文件中存在一處,比較節(jié)省程序空間;
  • 7.函數(shù)的調(diào)用會(huì)牽扯到參數(shù)的傳遞,壓棧/出棧操作,速度相對較慢;
  • 8.函數(shù)的參數(shù)存在傳值和傳地址(指針)的問題,參數(shù)宏不存在;

7.注意事項(xiàng)

  • 1.宏定義不會(huì)對引號內(nèi)的參數(shù)進(jìn)行替換;
  • 2.若要替換,可以在參數(shù)前面加上’#’轉(zhuǎn)換成“字符串”,如:
#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);

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++?ffmpeg實(shí)現(xiàn)將視頻幀轉(zhuǎn)換成jpg或png等圖片

    C++?ffmpeg實(shí)現(xiàn)將視頻幀轉(zhuǎn)換成jpg或png等圖片

    有時(shí)播放實(shí)時(shí)流的時(shí)候有截圖的需求,需要將解碼出來的圖片保存本地或上傳服務(wù)器,這時(shí)就需要將avframe中的數(shù)據(jù)編碼成png、jpg等格式的圖片,我們使用ffmpeg的相關(guān)編碼器就可以實(shí)現(xiàn)功能,下面就來講講具體實(shí)現(xiàn)方法吧
    2023-03-03
  • 賭你會(huì)懵的C語言指針進(jìn)階數(shù)組場景解析

    賭你會(huì)懵的C語言指針進(jìn)階數(shù)組場景解析

    這篇文章主要為大家介紹了關(guān)于C語言指針進(jìn)階的示例解析,來細(xì)化指針這一部分內(nèi)容,現(xiàn)在著重把一些指針的運(yùn)用情景搬出來康康,如果對指針盤的不是非常熟練,或者指針還出于入門階段的鐵子請繞道
    2022-02-02
  • C和C++如何實(shí)現(xiàn)互相調(diào)用詳解

    C和C++如何實(shí)現(xiàn)互相調(diào)用詳解

    在學(xué)習(xí)c++中用到一些古老的c語言庫時(shí),在工作中我們經(jīng)常要使用C和C++混合編程,下面這篇文章主要給大家介紹了關(guān)于C和C++如何實(shí)現(xiàn)互相調(diào)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 詳解C++引用變量時(shí)那些你不知道的東西

    詳解C++引用變量時(shí)那些你不知道的東西

    這篇文章主要為大家詳細(xì)介紹了C++引用變量時(shí)那些你不知道的東西——引用變量延遲綁定,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • 淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解

    淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解

    本篇文章是對C++日志系統(tǒng)log4cxx的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解

    Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解

    Prim算法能夠在帶權(quán)的圖中搜索出最小生成樹,這也是各大ACM和面試及考研題目中的熱點(diǎn),下面我們就來詳細(xì)看一下Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解
    2016-06-06
  • 淺析C++中的重載,隱藏和覆蓋

    淺析C++中的重載,隱藏和覆蓋

    在C++語言中,函數(shù)扮演著很重要的角色,不管面向過程設(shè)計(jì),還是基于對象設(shè)計(jì)。本文主要為大家介紹了函數(shù)中重載、覆蓋和隱藏的相關(guān)知識,感興趣的小伙伴可以了解一下
    2022-12-12
  • 純C語言:分治問題源碼分享

    純C語言:分治問題源碼分享

    這篇文章主要介紹了純C語言:分治問題源碼,有需要的朋友可以參考一下
    2014-01-01
  • C++ 數(shù)據(jù)結(jié)構(gòu)之布隆過濾器

    C++ 數(shù)據(jù)結(jié)構(gòu)之布隆過濾器

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之布隆過濾器的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    這篇文章主要介紹了VSstudio中scanf返回值被忽略的原因及其解決方法,scanf返回值被忽略,接下來我就告訴大家該如何解決這個(gè)問題,需要的朋友可以參考下
    2022-09-09

最新評論