基于C中含有if的宏定義詳解
更新時(shí)間:2013年05月28日 08:56:27 作者:
本篇文章是對(duì)C中含有if的宏定義進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
含有if的宏定義
當(dāng)宏定義中含有 if 時(shí)
1) 定義如下宏
#define DC(p) if( foo(p) )fun(p)
用在下面的環(huán)境中
if(k>n)
DC(k);
else
DC(n);
宏替換后,如下
if(k>n)
if( foo(k) )
fun(k);
else
if( foo(n) )
fun( n );
可見, 原來(lái)的 if 和 else 不再配對(duì).
2) 為了避免這類問題, 我們可以將包含if語(yǔ)句的宏定義為一個(gè)整體.
#define DC(p) {if( foo(p) ) fun(p);}
但是, 替換后變?yōu)?BR>if(k>n)
{
if( foo(k) )
fun(k);
};else ...
由于else前面多了個(gè)分號(hào), 編譯時(shí)會(huì)提示錯(cuò)誤沒有與else配對(duì)的if.
3)因?yàn)檫@些原因, 在宏定義中, 經(jīng)常會(huì)將語(yǔ)句序列放入 do{...}while(0)塊中.
如下
#define DC(p) do{( if( foo(p) ) fun(p); }while(0)
替換后
if(k>n)
do
{
if( foo(k) )
fun(k);
}while(0);
else
...
程序可以正常運(yùn)行
4)替換方案
a)采用 ? : 表達(dá)式
#define DC(p) ( (foo(p)) ? (fun(p)):0)
b)利用布爾運(yùn)算的短路徑求值屬性
#define DC(p) ( (foo(p)) && (fun(p), 1) )
參考書籍: <<代碼閱讀方法與實(shí)踐>>
當(dāng)宏定義中含有 if 時(shí)
1) 定義如下宏
#define DC(p) if( foo(p) )fun(p)
用在下面的環(huán)境中
if(k>n)
DC(k);
else
DC(n);
宏替換后,如下
if(k>n)
if( foo(k) )
fun(k);
else
if( foo(n) )
fun( n );
可見, 原來(lái)的 if 和 else 不再配對(duì).
2) 為了避免這類問題, 我們可以將包含if語(yǔ)句的宏定義為一個(gè)整體.
#define DC(p) {if( foo(p) ) fun(p);}
但是, 替換后變?yōu)?BR>if(k>n)
{
if( foo(k) )
fun(k);
};else ...
由于else前面多了個(gè)分號(hào), 編譯時(shí)會(huì)提示錯(cuò)誤沒有與else配對(duì)的if.
3)因?yàn)檫@些原因, 在宏定義中, 經(jīng)常會(huì)將語(yǔ)句序列放入 do{...}while(0)塊中.
如下
#define DC(p) do{( if( foo(p) ) fun(p); }while(0)
替換后
if(k>n)
do
{
if( foo(k) )
fun(k);
}while(0);
else
...
程序可以正常運(yùn)行
4)替換方案
a)采用 ? : 表達(dá)式
#define DC(p) ( (foo(p)) ? (fun(p)):0)
b)利用布爾運(yùn)算的短路徑求值屬性
#define DC(p) ( (foo(p)) && (fun(p), 1) )
參考書籍: <<代碼閱讀方法與實(shí)踐>>
您可能感興趣的文章:
相關(guān)文章
VSCODE+cmake配置C++開發(fā)環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了VSCODE+cmake配置C++開發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
C++11運(yùn)算符重載和向量類重載實(shí)例詳解(<<,>>,+,-,*等)
這篇文章主要給大家介紹了關(guān)于C++11運(yùn)算符重載和向量類重載的相關(guān)資料,主要包括<<,>>,+,-,*等,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
C++如何實(shí)現(xiàn)簡(jiǎn)單的計(jì)時(shí)器詳解
因?yàn)樽罱e著無(wú)聊就想著要不用C++寫點(diǎn)什么東西,仔細(xì)想了想其實(shí)自己的C++學(xué)的也不怎么好,寫個(gè)簡(jiǎn)單的計(jì)時(shí)器吧!所以下面這篇文章主要介紹了利用C++如何實(shí)現(xiàn)簡(jiǎn)單的計(jì)時(shí)器,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01
C++詳細(xì)講解圖論的基礎(chǔ)與圖的儲(chǔ)存
圖論〔Graph?Theory〕是數(shù)學(xué)的一個(gè)分支。它以圖為研究對(duì)象。圖論中的圖是由若干給定的點(diǎn)及連接兩點(diǎn)的線所構(gòu)成的圖形,這種圖形通常用來(lái)描述某些事物之間的某種特定關(guān)系,用點(diǎn)代表事物,用連接兩點(diǎn)的線表示相應(yīng)兩個(gè)事物間具有這種關(guān)系2022-05-05
Win32下C++實(shí)現(xiàn)快速獲取硬盤分區(qū)信息
這篇文章主要為大家詳細(xì)介紹了Win32下C++如何實(shí)現(xiàn)快速獲取硬盤分區(qū)信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
基于QT制作一個(gè)TCPServer與TCPClient的通信
這篇文章主要為大家詳細(xì)介紹了如何基于QT制作一個(gè)TCPServer與TCPClient的通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

