最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年05月18日 08:47:17   投稿:hebedich  
宏替換是C/C++系列語言的技術(shù)特色,C/C++語言提供了強(qiáng)大的宏替換功能,源代碼在進(jìn)入編譯器之前,要先經(jīng)過一個稱為“預(yù)處理器”的模塊,這個模塊將宏根據(jù)編譯參數(shù)和實際編碼進(jìn)行展開,展開后的代碼才正式進(jìn)入編譯器,進(jìn)行詞法分析、語法分析等等。

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

考慮一下:

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

如果某人(不明智地)地寫了一個叫“alpha”或“beta”的宏,那么它將不會被編譯,或者被錯誤地編譯,產(chǎn)生不可預(yù)知的結(jié)果。例如,“someheader.h”可能包含:

  #define alpha 'a'
  #define beta b[2]

將宏(而且僅僅是宏)全部大寫的習(xí)慣,會有所幫助,但是對于宏并沒有語言層次上的保護(hù)機(jī)制。例如,雖然成員的名字包含在結(jié)構(gòu)體的內(nèi)部,但這無濟(jì)于事:在編譯器能夠正確地辨別這一點之前,宏已經(jīng)將程序作為一個字符流進(jìn)行了處理。順便說一句,這是C 和C++程序開發(fā)環(huán)境和工具能夠被簡化的一個主要原因:人與編譯器看到的是不同的東西。

不幸的是,你不能假設(shè)別的程序員總是能夠避免這種你認(rèn)為“相當(dāng)白癡”的事情。例如,最近有人報告我,他們遇到了一個包含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;
}

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

一個常見的微妙問題是,一個函數(shù)風(fēng)格的宏并不遵守函數(shù)參數(shù)傳遞的規(guī)則。例如:

#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”的問題,可以通過在“調(diào)用”時或宏定義時添加一對圓括號來解決:

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

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

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

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

相關(guān)文章

  • 深入分析C語言存儲類型與用戶空間內(nèi)部分布

    深入分析C語言存儲類型與用戶空間內(nèi)部分布

    這篇文章主要介紹了C語言存儲類型與用戶空間內(nèi)部分布,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • C++實現(xiàn)頁面的緩沖區(qū)管理器

    C++實現(xiàn)頁面的緩沖區(qū)管理器

    這篇文章主要介紹了C++實現(xiàn)頁面的緩沖區(qū)管理器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • C語言繪制簡單時鐘小程序

    C語言繪制簡單時鐘小程序

    這篇文章主要為大家詳細(xì)介紹了C語言繪制簡單時鐘小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 在C++?中慎用setjmp和longjmp解析

    在C++?中慎用setjmp和longjmp解析

    setjmp和longjmp是C語言中用于實現(xiàn)非局部跳轉(zhuǎn)的函數(shù),setjmp和longjmp 是 C 語言中一個很強(qiáng)大的函數(shù),這篇文章主要介紹了在C++?中慎用setjmp和longjmp的相關(guān)知識,需要的朋友可以參考下
    2023-06-06
  • C語言實現(xiàn)簡易的掃雷游戲

    C語言實現(xiàn)簡易的掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡易的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中拷貝構(gòu)造函數(shù)的使用

    C++中拷貝構(gòu)造函數(shù)的使用

    大家好,本篇文章主要講的是C++中拷貝構(gòu)造函數(shù)的使用,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 最長公共子字符串的使用分析

    最長公共子字符串的使用分析

    本篇文章是對最長公共子字符串的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++11智能指針之weak_ptr詳解

    C++11智能指針之weak_ptr詳解

    這篇文章主要介紹了 C++11智能指針之weak_ptr詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • C語言實現(xiàn)猜數(shù)字小游戲的示例代碼

    C語言實現(xiàn)猜數(shù)字小游戲的示例代碼

    猜數(shù)字小游戲是我們小時候喜歡我們一個經(jīng)典小游戲。這篇文章將利用C語言中的循環(huán)語句、分支語句和函數(shù)實現(xiàn)這一游戲,需要的可以參考一下
    2022-10-10
  • C++利用socket傳輸大文件的實現(xiàn)代碼

    C++利用socket傳輸大文件的實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket傳輸大文件的實現(xiàn)代碼,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-10-10

最新評論

吉水县| 土默特左旗| 仪陇县| 阿尔山市| 阿荣旗| 镇宁| 平凉市| 蒙自县| 南丹县| 慈利县| 成安县| 会宁县| 林口县| 尼玛县| 南乐县| 青海省| 滨州市| 宝鸡市| 怀仁县| 响水县| 沙坪坝区| 古浪县| 瑞昌市| 黄陵县| 汕头市| 阿图什市| 鹰潭市| 墨江| 连南| 巴塘县| 犍为县| 庆城县| 秦皇岛市| 伊通| 旅游| 玛沁县| 屯留县| 韩城市| 左权县| 杨浦区| 凤冈县|