• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 16,  comments - 34,  trackbacks - 0

            一、 統(tǒng)一的預(yù)處理、編譯、鏈接程序


                    一、1. 有些程序同時具有如下功能:

            1. 預(yù)處理C/C++源代碼
            2. 編譯C/C++源代碼
            3. 鏈接C/C++目標(biāo)代碼

            例如:GCC的gcc、g++,MSVC的cl.exe。


                    一、2. 實(shí)際的情況也許更加復(fù)雜:

            gcc、g++、cl.exe很有可能只是一個啟動器
            用戶只需要使用它們, 它們內(nèi)部再根據(jù)特定條件, 執(zhí)行其他程序,比如:

            1. gcc、g++編譯C/C++代碼時, 最終會執(zhí)行cc1/cc1plus程序。
            該程序可能才是真正的C/C++編譯器。

            2. gcc、g++在鏈接C/C++目標(biāo)代碼時,最終會執(zhí)行ld程序。
            該程序可能才是真正的鏈接器。

            3. cl.exe程序自己處理C/C++代碼的預(yù)處理與編譯工作。

            4. cl.exe程序鏈接時,將執(zhí)行link.exe
            該程序可能才是真正的鏈接器。


                    一、3. 我們的關(guān)注點(diǎn)

            ——上述復(fù)雜的情況我們大多數(shù)情況下無須操心:

            1. 我們只需要使用gcc、g++
            即使以后GCC將cc1、cc1plus、ld改為別的名字也不會受影響。

            2. 我們只需要使用cl
            即使以后cl不再擔(dān)任編譯工作或者link.exe被改為別的名字,同樣不受影響。


            ——我們需要關(guān)心這些統(tǒng)一的程序,是根據(jù)何種條件, 決定它們的操作的?

            本文只討論編譯:
            1. 它們默認(rèn)是通過何種條件, 決定按C語法或按C++語法編譯一個翻譯單元的。
            2. 如何顯式指定按C語法或者按C++語法去編譯一個翻譯單元。



            二、 默認(rèn)情況

            如果不顯式指定操作, gcc、g++、cl都是按文件后綴名來決定操作的。

                    二、1. 測試文件:
            #ifndef __cplusplus
            /* being treated as C translation unit */
            #error !---  C  ---!
            #else
            // being treated as C++ translation unit
            #error !--- C++ ---!
            #endif

            我們建一個沒有后綴的文件,叫nosuffix, 寫入如上內(nèi)容。
            而且, 我們也不需要編譯出目標(biāo)代碼。
            只需要測試__cplusplus宏(見《預(yù)定義__cplusplus宏》)是否存在,并且用#error報告即可。

            然后建立一些內(nèi)容完全一樣的文件:

            #include "nosuffix"


            這些文件共有10個:
            c.c、 cpp.cpp、txt.txt、UC.C、UCPP.CPP、cc.cc、cxx.cxx、inl.inl、c++.c++、cp.cp。
            (UC和UCPP是為了測試大寫后綴名)


                    二、2. 測試方法

            對GCC使用:
            gcc(g++) filename >stdout.txt 2>stderr.txt

            對MSVC使用:
            cl filename >stdout.txt 2>stderr.txt


                    二、3. 測試結(jié)果

            gcc、g++、cl對以下后綴名文件的默認(rèn)操作如下

             

            nosuffix

            .c

            .cpp

            .txt

            .C

            .CPP

            .cc

            .cxx

            .inl

            .c++

            .cp

            gcc

            obj

            C

            C++

            obj

            C++

            C++

            C++

            C++

            obj

            C++

            C++

            g++

            obj

            C++

            C++

            obj

            C++

            C++

            C++

            C++

            obj

            C++

            C++

            cl

            obj

            C

            C++

            obj

            C

            C++

            C++

            C++

            obj

            obj

            obj


            對該表的幾點(diǎn)說明:
            1. 表中的obj表示該條件下, 統(tǒng)一程序?qū)⑺鼈冋J(rèn)作目標(biāo)文件, 并打算執(zhí)行鏈接工作。
            這顯然是錯誤的, 因?yàn)樗麄儼氖俏谋尽?br>
            2. gcc、g++(編譯代碼)的區(qū)別
            GCC認(rèn)為帶有.c、.cpp、.C、.CPP、.cc、.cxx、.c++、.cp(但不限于)后綴的文件是C/C++源文件。
            gcc把帶有.c后綴的文件, 當(dāng)作C源文件, 把帶有其他后綴名的文件當(dāng)作C++源文件。
            g++將帶有上述所有后綴的文件,都當(dāng)作C++源文件。

            3. MSVC與GCC的區(qū)別
            MSVC認(rèn)為帶有.c、.cpp、.C、.CPP、.cc、.cxx后綴的文件是C/C++源文件。
            上述GCC相比, 排除了.c++和.cp

            同時,windows下的文件名是不區(qū)分大小寫的, 所以.c同.C,.cpp同.CPP是一樣的。
            與GCC相比, .C不再認(rèn)為是C++源文件, 而是與.c一樣作為C源文件處理。


                    二、4. 測試小結(jié)

            由上表以及說明, 如果我們打算編寫跨平臺的代碼

            1. 不推薦使用的后綴名
            .c++、.cp
            ——因?yàn)樗鼈儾槐籑SVC支持
            .C
            ——因?yàn)镸SVC并不區(qū)別對待.c與.C


            2. 可以使用的后綴名
            ——對C源文件
            可以使用.c。

            ——對C++源文件
            可以使用.cpp、.cc、.cxx。

            ——.CPP不推薦
            因?yàn)樵趚nix上 a.CPP與a.cpp是2個文件, 而復(fù)制到Windows上就將發(fā)生重名。
            如果只使用.cpp就可以避免該情況。


            3. 關(guān)于.inl
            有些文件內(nèi)容確實(shí)是C/C++代碼, 但是卻不直接作為翻譯單元,而是被其他翻譯單元包含。
            理論上說,它們?nèi)∪魏蚊侄紱]關(guān)系。但是將它們?nèi)?inl會得到一些好處:
                ——  暗示該文件包含C/C++代碼
                ——  一些編輯器會對其按C/C++語法進(jìn)行高亮。




            三、 顯式指定

            有時候需要覆蓋默認(rèn)情況,顯式指定我們需要的操作。

                    三、1. GCC “-x

            GCC通過-x選項(xiàng)顯式指定編譯源代碼的語言:
            -x c(或-xc)
                ——  將源代碼作為C源文件。
            -x c++、(或-xc++)
                ——  將源代碼作為C++源文件。

            對于“二”中的測試, 只要將命令行改為:
            gcc(g++) -x c (-xc) filename

            所有文件都將被作為C源文件處理, 并輸出 error !---  C  ---!

            而使用如下命令行:
            gcc(g++) -x c++ (-xc++) filename

            所有文件都將被作為C++源文件處理, 并輸出 error !--- C++ ---!


                    三、2. MSVC “/TC” “/TP”

            MSVC通過/TC(/TP)選項(xiàng), 顯式指定將輸入作為C(C++)源代碼。

            對“二”中的測試, 命令行:
            cl /TC filename

            對所有文件都將輸出 error !---  C  --- !

             

            命令行:
            cl /TP filename

            對所有文件都將輸出 error !--- C++ ---!






            四、總結(jié)

            1. 使用“二、4”中推薦的方式,給源代碼文件命名。
            2. 覆蓋默認(rèn)情況,使用-x(GCC)或者/TC、/TP(MSVC)
            3. 順帶提一點(diǎn), gcc、g++用作鏈接時, 也有一些區(qū)別。
            鏈接C++(或者C/C++混合)目標(biāo)代碼, 推薦使用g++。
            因?yàn)镚CC高版本中, gcc鏈接時默認(rèn)不會導(dǎo)入C++需要的運(yùn)行時庫。





            相關(guān)鏈接:

            ——源代碼
            http://immature.googlecode.com/svn/trunk/iMmature/sample/compiler_options/language

            ——《預(yù)定義__cplusplus宏
            http://m.shnenglu.com/ownwaterloo/archive/2009/04/20/predefined_macro___cplusplus.html




            Creative Commons License
            作品采用知識共享署名-非商業(yè)性使用-相同方式共享 2.5 中國大陸許可協(xié)議進(jìn)行許可。

            轉(zhuǎn)載請注明 :
            文章作者 - OwnWaterloo
            發(fā)表時間 - 2009年04月20日
            原文鏈接 - http://m.shnenglu.com/ownwaterloo/archive/2009/04/20/compiler_options_language.html

            posted on 2009-04-20 15:02 OwnWaterloo 閱讀(2712) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(8)

            隨筆檔案(16)

            鏈接

            搜索

            •  

            積分與排名

            • 積分 - 198343
            • 排名 - 134

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            日韩久久久久久中文人妻| 久久精品国产亚洲综合色| 国产精品成人久久久久三级午夜电影| a高清免费毛片久久| 久久99国产精品久久99果冻传媒| 91精品国产高清久久久久久国产嫩草| 久久亚洲av无码精品浪潮| 77777亚洲午夜久久多喷| 粉嫩小泬无遮挡久久久久久| 91精品国产综合久久四虎久久无码一级 | 97超级碰碰碰久久久久| 久久久精品一区二区三区| 精品伊人久久久| 国产精品99久久99久久久| 欧美一级久久久久久久大片| 久久精品黄AA片一区二区三区| AAA级久久久精品无码片| 久久国产综合精品五月天| 亚洲人成精品久久久久| 国产AV影片久久久久久| 久久精品aⅴ无码中文字字幕重口| 亚洲性久久久影院| 国产ww久久久久久久久久| 久久久久久毛片免费播放| 久久精品国产99久久久古代| 久久99精品久久久久久噜噜| 国产精品一区二区久久不卡| 久久精品国产久精国产果冻传媒 | 久久久久女人精品毛片| 狠狠色丁香久久婷婷综合_中| 久久99精品九九九久久婷婷| 狠狠干狠狠久久| 91精品国产色综合久久| 色婷婷综合久久久久中文一区二区| 色婷婷狠狠久久综合五月| 久久久久免费视频| 久久精品国产亚洲Aⅴ香蕉| 久久精品亚洲欧美日韩久久| 久久精品成人免费观看97| 久久久青草青青国产亚洲免观 | 人妻精品久久无码区|