C 中巨集的使用問題詳解

2022-10-04 01:48:10 字數 1292 閱讀 5246

巨集不遵循c++中關於範圍和型別的規則。這經常導致一些微妙的或不那麼微妙的問題。因此,c++提供更適合其他的c++(譯註:原文為the rest of c++,當指c++除了相容c 以外的部分)的替代品,例如內聯函式、模板與名字空間。

考慮一下:

#include "someheader.h"

struct ;

如果某人(不明智地)地寫了乙個叫「alpha」或「beta」的巨集,那麼它將不會被編譯,或者被錯誤地編譯,產生不可預知的結果。例如,「someheader.h」可能包含:

#define alpha 'a'

#define beta b[2]

將巨集(而且僅僅是巨集)全部大寫的習慣,會有所幫助,但是對於巨集並沒有語言層次上的保護機制。例如,雖然成員的名字包含在結構體的內部,但這無濟於事:在編譯器能夠正確地辨別這一點之前,巨集已經將程式作為乙個字元流進行了處理。順便說一句,這是c 和c++程式開發環境和工具能夠被簡化的乙個主要原因:人與編譯器看到的是不同的東西。

不幸的是,你不能假設別的程式設計師總是能夠避免這種你認為「相當白痴」的事情。例如,最近有人報告我,他們遇到了乙個包含goto 的巨集。我也見過這種情況,而且聽到過一些——在很脆弱的時候——看起來確實有理的意見。例如:

#define prefix get_ready(); int ret__

#define return(i) ret__=i; do_something(); goto exit

#define suffirqdsvx exit: cleanup(); return ret__

void f()

作為乙個維護的程式設計師,就會產生這種印象;將巨集「隱藏」到乙個標頭檔案中——這並不罕見——使得這種「魔法」更難以被辨別。

乙個常見的微妙問題是,乙個函式風格的巨集並不遵守函式引數傳遞的規則。例如:

#define square(x) (x*x)

void f(double d, int i)

「d+1」的問題,可以通過在「呼叫」時或巨集定義時新增一對圓括號來解決:

#define square(x) ((x)*(x)) /*這樣更好 */

但是, i++被執行了兩次(可能並不是有意要這麼做)的問題仍然存在。

是的,我確實知道有些特殊的巨集並不會導致c/c++預處理巨集這樣的問題。但是,我無心去發展c++中的巨集。作為替代,我推薦使用c++語言中合適的工具,例如內聯函式,模板rqdsv,建構函式(用來初始化),析構函式(用來清除),異常(用來退出上下文環境),等等。

好了,今天就先到這裡以後我們再來更深入的**這個問題

本文標題: c++中巨集的使用問題詳解

本文位址:

C 預處理和巨集的使用詳解

test.cpp 定義控制台應用程式的入口點。1 看下面的 並寫出結果 考點 ifdef else endif 在程式中的使用。2.巨集定義的使用 考點 使用 define巨集定義時需要注意的地方 3.include stdafx.h include include define debug 預處理...

python 巨集使用詳解

什麼是巨集?巨集類似python中的函式,可以傳引數進去,但不能有返回值!在實際開發專案中,可以將一些復用 抽取出來放到巨集中,然後把不固定的值作為變數!巨集的使用!然後我們通過模板渲染的方式來實現這個表單!新建乙個test.py檔案,如下 相信很多朋友都記得滾瓜爛熟了!from flask imp...

C 巨集定義詳解

一 define的基本用法 define是c語言中提供的巨集定義命令,其主要目的是為程式設計師在程式設計時提供一定的方便,並能在一定程度上提高程式的執行效率,但學生在學習時往往不能 理解該命令的本質,總是在此處產生一些困惑,在程式設計時誤用該命令,使得程式的執行與預期的目的不一致,或者在讀別人寫的程...