亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中宏的使用問題詳解

2020-05-23 14:04:15
字體:
來源:轉載
供稿:網友
宏替換是C/C++系列語言的技術特色,C/C++語言提供了強大的宏替換功能,源代碼在進入編譯器之前,要先經過一個稱為“預處理器”的模塊,這個模塊將宏根據編譯參數和實際編碼進行展開,展開后的代碼才正式進入編譯器,進行詞法分析、語法分析等等。
 

宏不遵循C++中關于范圍和類型的規則。這經常導致一些微妙的或不那么微妙的問題。因此,C++提供更適合其他的C++(譯注:原文為the rest of C++,當指C++除了兼容C 以外的部分)的替代品,例如內聯函數、模板與名字空間。

考慮一下:

#include "someheader.h"struct S {  int alpha;  int beta;};

如果某人(不明智地)地寫了一個叫“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 suffix exit: cleanup(); return ret__void f(){  prefix;  // ...  Return(10);  // ...  Return(x++);  //...  suffix;}

作為一個維護的程序員,就會產生這種印象;將宏“隱藏”到一個頭文件中——這并不罕見——使得這種“魔法”更難以被辨別。

一個常見的微妙問題是,一個函數風格的宏并不遵守函數參數傳遞的規則。例如:

#define square(x) (x*x)void f(double d, int i){  square(d); // 好  square(i++); // 糟糕:這表示 (i++*i++)  square(d+1); //糟糕:這表示(d+1*d+1); 也就是 (d+d+1)  // ...}

“d+1”的問題,可以通過在“調用”時或宏定義時添加一對圓括號來解決:

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

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

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

好了,今天就先到這里,以后我們再來更深入的探討這個問題



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影免费在线观看中文字幕| 少妇高潮久久77777| 欧美猛男性生活免费| 97视频在线观看免费| 在线一区二区日韩| 亚洲白虎美女被爆操| 亚洲欧美制服第一页| 国产精品99久久99久久久二8| 国产97人人超碰caoprom| 国产精品专区h在线观看| 亚洲美女自拍视频| 久久久人成影片一区二区三区观看| 国产啪精品视频| 久久九九热免费视频| 国语自产精品视频在线看一大j8| 欧美日韩国产精品一区二区三区四区| 欧日韩在线观看| 欧美不卡视频一区发布| 中文字幕亚洲无线码a| 久久精品国产v日韩v亚洲| 夜夜嗨av色一区二区不卡| 丝袜美腿精品国产二区| 精品国产乱码久久久久久婷婷| 成人网中文字幕| 久久免费精品日本久久中文字幕| 欧美激情精品久久久久久免费印度| 中文字幕视频一区二区在线有码| 国模私拍一区二区三区| 精品福利在线看| 欧美亚州一区二区三区| 日韩中文有码在线视频| 久久色免费在线视频| 欧美中文字幕在线观看| 国产一区二区丝袜| 国产精品日日做人人爱| 日韩美女视频免费看| 97在线观看免费| 91免费版网站入口| 欧美猛交免费看| 欧美日韩国产在线播放| 日韩经典中文字幕| 国产精品高清免费在线观看| 欧美视频一二三| 91在线免费看网站| 国产精品专区一| 国产精品黄页免费高清在线观看| 欧美日韩成人精品| 91精品久久久久久久久不口人| 日韩av手机在线看| 91精品免费视频| 久久中文字幕国产| 日韩av电影手机在线| 91精品国产自产91精品| 欧美成人一二三| 91po在线观看91精品国产性色| 国产在线观看精品一区二区三区| 欧美激情一区二区三区成人| 性视频1819p久久| 精品视频—区二区三区免费| 日韩av网站导航| 国产欧美日韩中文字幕| 亚洲欧美在线一区二区| 国产精品亚洲аv天堂网| 日韩美女写真福利在线观看| 2019中文在线观看| 亚洲精品久久在线| 亚洲三级黄色在线观看| 久久精品久久久久电影| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲女人天堂成人av在线| 久久久久日韩精品久久久男男| 九九久久国产精品| 国产精品白嫩初高中害羞小美女| 欧美精品福利视频| 亚洲欧洲国产精品| 亚洲大胆人体在线| www欧美日韩| 国产精品久久在线观看| 97国产真实伦对白精彩视频8| 日本国产一区二区三区| 精品成人国产在线观看男人呻吟| 黑人狂躁日本妞一区二区三区| 91啪国产在线| 日本成人激情视频| 欧美成年人视频网站欧美| 国产中文字幕日韩| 亚洲影院污污.| 久久精品国产亚洲| 日韩亚洲综合在线| 日韩激情av在线免费观看| 91免费综合在线| 日韩欧美亚洲国产一区| 亚洲精品小视频在线观看| 久久人人爽人人爽爽久久| 欧美激情伊人电影| 亚洲尤物视频网| 成人国产精品色哟哟| 这里只有精品久久| 欧美一级免费视频| 欧美日韩国产123| 日本成人黄色片| 国产亚洲精品91在线| 国产精品久久婷婷六月丁香| 日韩一区av在线| 第一福利永久视频精品| 日韩av123| 欧美另类交人妖| 国产成人极品视频| 韩国精品美女www爽爽爽视频| 欧美一区三区三区高中清蜜桃| 亚洲欧美一区二区三区久久| 欧美做爰性生交视频| 欧美性videos高清精品| 久久久999精品| 国产精品久久久久国产a级| 欧美视频第一页| 成人网页在线免费观看| 黑人极品videos精品欧美裸| 欧美极品在线播放| 精品中文字幕久久久久久| 九色成人免费视频| 精品中文视频在线| 成人黄色免费在线观看| 欧美日韩国产成人| 亚洲一区二区免费| 日韩在线视频线视频免费网站| 久久免费少妇高潮久久精品99| 亚洲精品国产综合久久| 国产精品女人网站| 国产日韩欧美成人| 精品久久久久久久大神国产| 日韩av观看网址| 国产精品欧美日韩久久| 97人洗澡人人免费公开视频碰碰碰| 久久久亚洲国产| 中文字幕欧美亚洲| 亚洲欧美另类中文字幕| 国产精品久久久久av免费| 久久国产精品免费视频| 欧美国产激情18| 日韩免费在线电影| 亚洲人成电影在线播放| 日韩精品免费在线| 成人乱人伦精品视频在线观看| 欧美日本高清一区| 日韩最新在线视频| 日韩av在线高清| 色噜噜狠狠色综合网图区| 福利视频第一区| 亚洲va久久久噜噜噜久久天堂| 欧美性做爰毛片| 国产成人免费av电影| 精品视频久久久| 国产精品日韩在线播放| 日韩精品视频观看| 亚洲国产精品成人av| 欧美在线性视频| 97精品视频在线播放| 亚洲最大成人在线| 国产精品美女呻吟| 国产精品视频公开费视频| 欧美亚洲国产另类| 久久久视频免费观看| 色爱精品视频一区|