C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析
C語(yǔ)言中#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)試開(kāi)關(guān)
有時(shí)候編寫(xiě)程序時(shí)為方便查找錯(cuò)誤,會(huì)在很多地方加上串口打印語(yǔ)句直觀查看程序哪里出錯(cuò)。
但是,串口的輸出是需要時(shí)間的,在項(xiàng)目基本完成時(shí),就需要將這些打印關(guān)閉,但是一行一行的注釋掉費(fèi)時(shí)費(fèi)力,不現(xiàn)實(shí)。
這時(shí)可以使用宏來(lái)當(dāng)做一個(gè)"開(kāi)關(guān)",直接操作這個(gè)宏就可以實(shí)現(xiàn)打印的開(kāi)關(guān),例如:
//#define?? ?DEBUG(...) #define?? ??? ?DEBUG?? ?printf
另外,還可以使用幾個(gè)預(yù)定義的宏進(jìn)行輔助:
__FILE__?? ??? ??? ?// 文件
__FUNCTION__?? ??? ?// 函數(shù)
__LINE__?? ??? ??? ?// 行號(hào)
DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);2.條件編譯
當(dāng)程序?yàn)榱诉m配更多不同的環(huán)境時(shí),還可以使用條件宏來(lái)選擇不同的代碼模塊:
#if 1
?? ?printf("Hello!\n");
#else
?? ?printf("Hi!\n");
#endif3.宏實(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)注意到以上宏末尾都沒(méi)有帶分號(hào)“;”
5.防止頭文件被重復(fù)包含
#ifndef __TEST_H? #define __TEST_H? ?? ?// 頭文件內(nèi)容? #endif
6.帶參宏與帶參函數(shù)的區(qū)別
- 1.宏會(huì)在編譯器在對(duì)源代碼進(jìn)行編譯的時(shí)候進(jìn)行簡(jiǎn)單替換,不會(huì)進(jìn)行任何邏輯檢測(cè),即簡(jiǎn)單代碼復(fù)制而已;
- 2.宏進(jìn)行定義時(shí)不會(huì)考慮參數(shù)的類(lèi)型;
- 3.參數(shù)宏的使用會(huì)使具有同一作用的代碼塊在目標(biāo)文件中存在多個(gè)副本,即會(huì)增長(zhǎng)目標(biāo)文件的大??;
- 4.參數(shù)宏的運(yùn)行速度會(huì)比函數(shù)快,因?yàn)椴恍枰獏?shù)壓棧/出棧操作;
- 5.參數(shù)宏在定義時(shí)要多加小心,多加括號(hào);
- 6.函數(shù)只在目標(biāo)文件中存在一處,比較節(jié)省程序空間;
- 7.函數(shù)的調(diào)用會(huì)牽扯到參數(shù)的傳遞,壓棧/出棧操作,速度相對(duì)較慢;
- 8.函數(shù)的參數(shù)存在傳值和傳地址(指針)的問(wèn)題,參數(shù)宏不存在;
7.注意事項(xiàng)
- 1.宏定義不會(huì)對(duì)引號(hào)內(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)文章
Qt數(shù)據(jù)庫(kù)相關(guān)應(yīng)用開(kāi)發(fā)總結(jié)
這篇文章主要為大家介紹了在Qt數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)中的一些經(jīng)驗(yàn)總結(jié),以及一些組件的使用介紹。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-02-02
C++中的vector使用詳解及重要部分底層實(shí)現(xiàn)
本篇文章會(huì)對(duì)vector的語(yǔ)法使用進(jìn)行詳解,同時(shí),還會(huì)對(duì)重要難點(diǎn)部分的底層實(shí)現(xiàn)進(jìn)行講解,其中有vector的迭代器失效和深拷貝問(wèn)題,希望本篇文章的內(nèi)容會(huì)對(duì)你有所幫助2023-07-07
詳解C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用
這篇文章主要介紹了C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用,狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它的類(lèi),需要的朋友可以參考下2016-03-03
Matlab實(shí)現(xiàn)多子圖同步調(diào)整視角
這篇文章主要為大家介紹了如何利用Matlab實(shí)現(xiàn)多子圖同步調(diào)整視角,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03
數(shù)組中求第K大數(shù)的實(shí)現(xiàn)方法
本篇文章是對(duì)數(shù)組中求第K大數(shù)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++定義和初始化string對(duì)象實(shí)例詳解
這篇文章主要為大家介紹了C++定義和初始化string對(duì)象實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索
這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

