青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 16,  comments - 34,  trackbacks - 0

一、 統一的預處理、編譯、鏈接程序


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

1. 預處理C/C++源代碼
2. 編譯C/C++源代碼
3. 鏈接C/C++目標代碼

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


        一、2. 實際的情況也許更加復雜:

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

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

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

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

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


        一、3. 我們的關注點

——上述復雜的情況我們大多數情況下無須操心:

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

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


——我們需要關心這些統一的程序,是根據何種條件, 決定它們的操作的?

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



二、 默認情況

如果不顯式指定操作, 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, 寫入如上內容。
而且, 我們也不需要編譯出目標代碼。
只需要測試__cplusplus宏(見《預定義__cplusplus宏》)是否存在,并且用#error報告即可。

然后建立一些內容完全一樣的文件:

#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. 測試結果

gcc、g++、cl對以下后綴名文件的默認操作如下

 

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


對該表的幾點說明:
1. 表中的obj表示該條件下, 統一程序將它們認作目標文件, 并打算執行鏈接工作。
這顯然是錯誤的, 因為他們包含的是文本。

2. gcc、g++(編譯代碼)的區別
GCC認為帶有.c、.cpp、.C、.CPP、.cc、.cxx、.c++、.cp(但不限于)后綴的文件是C/C++源文件。
gcc把帶有.c后綴的文件, 當作C源文件, 把帶有其他后綴名的文件當作C++源文件。
g++將帶有上述所有后綴的文件,都當作C++源文件。

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

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


        二、4. 測試小結

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

1. 不推薦使用的后綴名
.c++、.cp
——因為它們不被MSVC支持
.C
——因為MSVC并不區別對待.c與.C


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

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

——.CPP不推薦
因為在xnix上 a.CPP與a.cpp是2個文件, 而復制到Windows上就將發生重名。
如果只使用.cpp就可以避免該情況。


3. 關于.inl
有些文件內容確實是C/C++代碼, 但是卻不直接作為翻譯單元,而是被其他翻譯單元包含。
理論上說,它們取任何名字都沒關系。但是將它們取為.inl會得到一些好處:
    ——  暗示該文件包含C/C++代碼
    ——  一些編輯器會對其按C/C++語法進行高亮。




三、 顯式指定

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

        三、1. GCC “-x

GCC通過-x選項顯式指定編譯源代碼的語言:
-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)選項, 顯式指定將輸入作為C(C++)源代碼。

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

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

 

命令行:
cl /TP filename

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






四、總結

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





相關鏈接:

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

——《預定義__cplusplus宏
http://www.shnenglu.com/ownwaterloo/archive/2009/04/20/predefined_macro___cplusplus.html




Creative Commons License
作品采用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協議進行許可。

轉載請注明 :
文章作者 - OwnWaterloo
發表時間 - 2009年04月20日
原文鏈接 - http://www.shnenglu.com/ownwaterloo/archive/2009/04/20/compiler_options_language.html

posted on 2009-04-20 15:02 OwnWaterloo 閱讀(2735) 評論(0)  編輯 收藏 引用
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 198798
  • 排名 - 134

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品一区二区久| 亚洲欧美国产制服动漫| av不卡在线看| 亚洲精品一区中文| 欧美大片免费观看在线观看网站推荐| 欧美日韩精品久久久| 亚洲视频一区二区免费在线观看| 亚洲精品一区在线| 国产欧美一区二区精品性| 久久久精品国产免费观看同学| 亚洲在线中文字幕| 狠狠色狠狠色综合人人| 亚洲成人在线视频播放| 国产一区二区主播在线| 久久久视频精品| 欧美丰满高潮xxxx喷水动漫| 亚洲午夜精品国产| 欧美在线观看网址综合| 亚洲激情婷婷| 亚洲手机成人高清视频| 在线免费观看成人网| 亚洲精品免费在线播放| 国产婷婷色一区二区三区| 欧美ed2k| 国产精品免费久久久久久| 另类欧美日韩国产在线| 欧美亚洲综合在线| 亚洲福利国产精品| 在线亚洲一区二区| 亚洲国产成人久久综合| 亚洲欧美激情一区二区| 91久久久久| 性欧美1819性猛交| 中国av一区| 久久婷婷国产综合精品青草| 亚洲欧美久久久| 欧美激情精品| 麻豆91精品91久久久的内涵| 国产精品久久久久77777| 欧美激情第一页xxx| 国产婷婷色一区二区三区| 一区二区国产在线观看| 亚洲全黄一级网站| 久久久久se| 欧美一区1区三区3区公司| 欧美日韩八区| 亚洲福利在线观看| 国产主播在线一区| 亚洲一区二区不卡免费| 亚洲天堂久久| 欧美日韩国产综合视频在线观看 | 黄色工厂这里只有精品| 亚洲一区二区在线| 国产亚洲一区在线| 国产伦精品一区二区三区四区免费| 亚洲第一福利在线观看| 国产一区欧美| 久久国产精品99久久久久久老狼| 午夜精品美女自拍福到在线| 欧美日韩视频免费播放| 亚洲人成人一区二区在线观看| 在线免费观看视频一区| 久久精品一本久久99精品| 久久se精品一区精品二区| 亚洲国产精品va在看黑人| 日韩午夜激情av| 在线一区二区三区做爰视频网站| 欧美第一黄网免费网站| 亚洲高清视频一区二区| 亚洲激情网址| 欧美日本亚洲韩国国产| 亚洲美女av电影| 中日韩午夜理伦电影免费| 欧美视频一区| 亚洲永久免费| 久久综合中文字幕| 最新中文字幕一区二区三区| 欧美成人一品| 一区二区三区四区国产精品| 亚洲欧美日韩国产另类专区| 国产日本欧洲亚洲| 久久久亚洲人| 亚洲精品久久久久久下一站| 亚洲专区一二三| 国产欧美日韩在线观看| 久久久久久久成人| 91久久极品少妇xxxxⅹ软件| 这里只有精品在线播放| 国产精品久久久久永久免费观看| 午夜精品一区二区三区在线视 | 一级日韩一区在线观看| 亚洲女性喷水在线观看一区| 国产一区二区三区久久久| 久久久久高清| 99精品99| 另类尿喷潮videofree| 一区二区精品在线| 国产伪娘ts一区| 欧美国产日韩免费| 亚洲欧美自拍偷拍| 亚洲国产一区在线| 久久aⅴ国产紧身牛仔裤| 亚洲激情综合| 国产区精品视频| 亚洲女性裸体视频| 午夜精品久久99蜜桃的功能介绍| 你懂的国产精品永久在线| 一区二区三区视频在线观看| 国内伊人久久久久久网站视频| 欧美成人免费一级人片100| 亚洲一区二区三区三| 欧美激情欧美激情在线五月| 午夜精品视频在线| 日韩写真在线| 伊人婷婷久久| 国产欧美婷婷中文| 欧美日韩国产二区| 美女性感视频久久久| 性欧美8khd高清极品| av成人免费| 亚洲综合色在线| 久久国产色av| 亚洲一区在线免费观看| 亚洲激情啪啪| 一区二区亚洲精品国产| 国产精品美女久久久久av超清 | 激情六月综合| 国产欧美日韩亚洲精品| 欧美日韩一二三四五区| 蜜臀av国产精品久久久久| 欧美中文字幕在线播放| 亚洲影院免费| 亚洲欧美伊人| 午夜精品久久久久99热蜜桃导演| 亚洲天堂视频在线观看| 日韩视频在线一区| 日韩视频在线观看免费| 亚洲激情六月丁香| 欧美韩国日本综合| 欧美寡妇偷汉性猛交| 欧美刺激性大交免费视频| 麻豆精品传媒视频| 奶水喷射视频一区| 女同性一区二区三区人了人一| 久久中文在线| 欧美成年人网| 亚洲国产成人久久综合一区| 亚洲高清视频一区二区| 亚洲激情小视频| 欧美大片网址| 最新亚洲一区| 亚洲靠逼com| 宅男噜噜噜66一区二区| 亚洲视频一二区| 午夜一区不卡| 久久久久国产一区二区三区| 麻豆九一精品爱看视频在线观看免费| 久久裸体艺术| 欧美精品乱人伦久久久久久| 欧美日韩精品系列| 国产精品你懂的在线| 国产一区二区视频在线观看| 一区二区三区在线观看欧美| 亚洲精品久久久久久久久久久久 | 国产欧美不卡| 精品动漫一区二区| 日韩手机在线导航| 亚洲免费一级电影| 久久亚洲精品视频| 亚洲国产欧美另类丝袜| av成人免费| 久久天天躁夜夜躁狠狠躁2022 | 欧美视频在线免费看| 国产欧美一区二区精品忘忧草| 亚洲高清不卡一区| 亚洲永久免费观看| 久久综合99re88久久爱| 亚洲精品免费观看| 先锋影音网一区二区| 欧美高清不卡| 国产日韩欧美二区| 亚洲乱码一区二区| 欧美在线视频a| 亚洲区一区二| 久久精品综合网| 欧美性猛交视频| 亚洲国产精品一区制服丝袜| 亚洲视频一区二区| 欧美国产在线电影| 久久福利影视| 欧美性开放视频| 亚洲高清在线精品| 欧美中文字幕在线视频| 亚洲激情不卡| 另类激情亚洲| 一区二区三区精品在线| 久久中文字幕导航| 亚洲资源av| 欧美剧在线观看| 亚洲国产日韩精品|