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

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

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

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

    Bjarne Stroustrup的FAQ:C++的風格與技巧

    發布: 2008-4-23 15:44 | 作者: 不詳 | 來源: www.wushuang.net | 查看: 121次 | 進入軟件測試論壇討論

    領測軟件測試網



    我不記得當時有過任何有關順序問題的深入思考或討論。那時,早期的一些使用者——特別是我——僅僅喜歡這種樣子:

    const int c = 10;

    看起來比這種更好:

    int const c = 10;

    也許我也受了這種影響:在我最早的一些使用“readonly”的例子中

    readonly int c = 10;

    比這個更具有可讀性:

    int readonly c = 10;

    我創造的那些最早的使用“const”的(C或C++)代碼,看來已經在全球范圍內取代了“readonly”。

    我記得這個語法的選擇在幾個人——例如Dennis Ritchie——當中討論過,但我不記得當時我傾向于哪種語言了。

    注意在固定指針(const pointer)中,“const”永遠出現在“*”之后。例如:

    int *const p1 = q; // 指向int變量的固定指針
    int const* p2 = q; //指向int常量的指針
    const int* p3 = q; //指向int常量的指針

    使用宏有什么問題?

    宏不遵循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++語言中合適的工具,例如內聯函數,模板,構造函數(用來初始化),析構函數(用來清除),異常(用來退出上下文環境),等等。

    文章來源于領測軟件測試網 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>