• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    C++風格與技巧

    發布: 2008-4-23 16:39 | 作者: 不詳 | 來源: research.att.com | 查看: 123次 | 進入軟件測試論壇討論

    領測軟件測試網


    不幸的是,你不能假設別的程序員總是能夠避免這種你認為“相當白癡”的事情。例如,最近有人報告我,他們遇到了一個包含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++語言中合適的工具,例如內聯函數,模板,構造函數(用來初始化),析構函數(用來清除),異常(用來退出上下文環境),等等。  

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>