gcc使用手冊(3)(轉)

BSDLite發表於2007-08-11
gcc使用手冊(3)(轉)[@more@]-print-libgcc-file-name

和`-print-file-name=libgcc.a'一樣.

-print-prog-name=program

類似於`-print-file-name',但是查詢程式program如`cpp'.



最佳化選項(OPTIMIZATION OPTION)

這些選項控制多種最佳化措施:

-O

-O1

最佳化.對於大函式,最佳化編譯佔用稍微多的時間和相當大的記憶體.

不使用`-O'選項時,編譯器的目標是減少編譯的開銷,使編譯結果能夠除錯.語句是獨
立的:如果在 兩條語句之間用斷點中止程式,你可以對任何變數重新賦值,或者在函
數體內把程式計數器指到其他語句,以及從源程式中 精確地獲取你期待的結果.

不使用`-O'選項時,只有宣告瞭register的變數才分配使用暫存器.編譯結果比不用
`-O'選項的PCC要略遜一籌.

使用了`-O'選項,編譯器會試圖減少目標碼的大小和執行時間.

如果指定了`-O'選項, `-fthread-jumps'和`-fdefer-pop'選項將被 開啟.在有del
ay slot的機器上, `-fdelayed-branch'選項將被開啟.在即使沒有幀指標 (frame
pointer)也支援除錯的機器上, `-fomit-frame-pointer'選項將被開啟.某些機器上
還可能會開啟其他選項.

-O2

多最佳化一些.除了涉及空間和速度交換的最佳化選項,執行幾乎所有的最佳化工作.例如不
進行迴圈展開(loop unrolling)和函式內嵌(inlining).和-O選項比較,這個選項既
增加了編譯時間,也提高了生成程式碼的 執行效果.

-O3

最佳化的更多.除了開啟-O2所做的一切,它還開啟了-finline-functions選項.

-O0

不最佳化.

如果指定了多個-O選項,不管帶不帶數字,最後一個選項才是生效的選項.

諸如`-fflag'此類的選項描述一些機器無關的開關.大多數開關具有肯定和否定兩種
格式; `-ffoo'開關選項的否定格式應該是`-fno-foo'.下面的列表只展示了一種格
式---那個不是 預設選項的格式.你可以透過去掉或新增`no-'構造出另一種格式.


-ffloat-store

不要在暫存器中存放浮點變數.這樣可以防止某些機器上不希望的過高精度,如6800
0的浮點暫存器(來自 68881)儲存的精度超過了double應該具有的精度.

對於大多數程式,過高精度只有好處.但是有些程式嚴格依賴於IEEE浮點數的定義.對
這樣的程式可以使用 `-ffloat-store'選項.

-fmemoize-lookups

-fsave-memoized

使用探索法(heuristic)進行更快的編譯(僅對C++).預設情況下不使用探索法.由於
探索法只對某些輸入檔案 有效,其他程式的編譯速度會變得更慢.

第一次編譯器必須對成員函式(或對成員資料的引用)建立一個呼叫.它必須(1)判斷
出這個類是否實現了那個名字的 成員函式; (2)決定呼叫哪個成員函式(涉及到推測
需要做哪種型別轉換); (3)檢查成員函式對呼叫者是否可見.所有這些構成 更慢的
編譯.一般情形,第二次對成員函式(或對成員資料的引用)建立的呼叫,必須再次經過
相同長度的處理.這意味著象 這樣的程式碼

cout << "This " << p << " has " << n << " legs. ";

對整個三步驟要做六次遍歷.透過使用軟體快取, ``命中''能夠顯著地減少這種代價
然而不幸的是,使用這種快取 必須實現其他機制,帶來了它自己的開銷. `-fmemoi
ze-lookups'選項開啟軟體快取.

因為函式的正文環境不同,函式對成員和成員函式的訪問權(可見性)也可能不同, g
++可能需要重新整理快取. 使用`-fmemoize-lookups'選項,每編譯完一個函式就重新整理緩
存.而`-fsave-memoized'選項 也啟用同樣的快取,但是當編譯器發覺最後編譯的函
數的正文環境產生的訪問權和下一個待編譯的函式相同,編譯器就 保留快取內容.這
對某個類定義許多成員函式時非常有用:除了某些其他類的友函式,每個成員函式擁
有和其他成員函式完全一樣 的訪問權,因而無需重新整理快取.

-fno-default-inline

預設為不要把成員函式內嵌,因為它們定義在類的作用域內(僅C++).

-fno-defer-pop

一旦函式返回,引數就立即彈出.對於那些呼叫函式後必須彈出引數的機器,編譯器一
般情況下讓幾次函式呼叫的引數 堆積在棧上,然後一次全部彈出.

-fforce-mem

做數學運算前把將要使用的記憶體運算元送入暫存器.透過把記憶體訪問轉換成潛在的公
共子表示式,它可能產生較好的目標碼. 如果它們不是公共子表示式,指令組合應該
消除各自的暫存器載荷.我樂意傾聽不同意見.

-fforce-addr

做數學運算前把將要使用的記憶體地址常數送入暫存器.它可能和`-fforce-mem'一樣
產生較好的 目標碼.我樂意傾聽不同意見.

-fomit-frame-pointer

對於不需要幀指標(frame pointer)的函式,不要在暫存器中儲存幀指標.這樣能夠避
免儲存,設定和恢復 幀指標的指令;同時對許多函式提供一個額外的暫存器. 但是在
大多數機器上將無法除錯.

某些機器上,如Vax,這個選項無效,因為標準呼叫序列自動處理幀指標,透過假裝不存
在而不儲存任何東西.機器描述宏 FRAME_POINTER_REQUIRED控制目標機是否支援這
個選項.

-finline-functions

把所有簡單的函式整合進呼叫者.編譯器探索式地決定哪些函式足夠簡單,值得這種
整合.

如果整合了所有給定函式的呼叫,而且函式宣告為static,那麼一般說來GCC有權不按
彙編程式碼輸出函式.

-fcaller-saves

允許在暫存器裡分配數值,但是這個方案通常受到各個函式呼叫的衝擊,因此GCC生成
額外的程式碼,在函式呼叫的 前後儲存和復原暫存器內容.僅當生成程式碼看上去優於反
之結果時才實現這樣的分配.

某些機器上該選項預設為允許,通常這些機器沒有呼叫保護暫存器代替使用.

-fkeep-inline-functions

即使整合了某個函式的所有呼叫,而且該函式宣告為static,仍然輸出這個函式一個
獨立的,執行時可呼叫 的版本.

-fno-function-cse

不要把函式地址存入暫存器;讓呼叫固定函式的指令顯式給出函式地址.

這個選項產生效率較低的目標碼,但是如果不用這個選項,某些不尋常的hack,改變匯
編器的輸出,可能因最佳化而帶來 困惑.

-fno-peephole

禁止任何機器相關的peephole最佳化.

-ffast-math

這個選項出於速度最佳化,允許GCC違反某些ANSI或IEEE規則/規格.例如,它允許編譯器
假設sqrt 函式的引數是非負數.

這個選項不被任何`-O'選項開啟,因為對於嚴格依靠IEEE或ANSI規則/規格實現的數
學函式,程式可能 會產生錯誤的結果.

下列選項控制特定的最佳化. `-O2'選項開啟下面的大多數最佳化項,除了`-funroll-lo
ops'和 `-funroll-all-loops'項.

而`-O'選項通常開啟`-fthread-jumps'和`-fdelayed-branch' 最佳化項,但是特定的
機器上的預設最佳化項有可能改變.

如果特別情況下非常需要``微調''最佳化,你可以使用下面的選項.

-fstrength-reduce

執行迴圈強度縮小(loop strength reduction)最佳化,並且消除重複變數.

-fthread-jumps

執行最佳化的地點是,如果某個跳轉分支的目的地存在另一個條件比較,而且該條件比
較包含在前一個比較語句之內,那麼 執行最佳化.根據條件是true或者false,前面那條
分支重定向到第二條分支的目的地或者緊跟在第二條分支後面.

-funroll-loops

執行迴圈展開(loop unrolling)最佳化.僅對迴圈次數能夠在編譯時或執行時確定的循
環實行.

-funroll-all-loops

執行迴圈展開(loop unrolling)最佳化.對所有迴圈實行.通常使程式執行的更慢.

-fcse-follow-jumps

在公共子表示式消元(common subexpression elimination)的時候,如果沒有其他路
徑到達某個跳轉的 目的地,就掃過這條jump指令.例如,如果CSE遇到帶有else從句的
if語句,當條件測試為 false時, CSE就跟在jump後面.

-fcse-skip-blocks

它類似於`-fcse-follow-jumps'選項,但是CSE跟在條件跳轉後面,條件跳轉跳過了
語句塊(block).如果CSE遇到一條簡單的if語句,不帶else從句, `-fcse-skip-bloc
ks'選項將導致CSE跟在if產生的跳轉後面.

-frerun-cse-after-loop

執行迴圈最佳化後,重新進行公共子表示式消元.

-felide-constructors

如果看上去合理就省略構造子(僅C++).根據這個選項,對於下面的程式碼, GNU C++直
接從呼叫foo 初始化y,而無需透過臨時變數:

A foo (); A y = foo ();

如果沒有這個選項, GNU C++首先透過呼叫型別A 合適的構造子初始化y;然後把 fo
o的結果賦給臨時變數;最後,用臨時變數替換`y'的初始值.

ANSI C++標準草案規定了預設行為(`-fno-elide-constructors').如果程式的構造
子存在 副效應, `-felide-constructors'選項能夠使程式有不同的表現,因為可能
忽略一些構造子的呼叫.

-fexpensive-optimizations

執行一些相對開銷較大的次要最佳化.

-fdelayed-branch

如果對目標機支援這個功能,它試圖重新排列指令,以便利用延遲分支(delayed bra
nch)指令後面的指令空隙.

-fschedule-insns

如果對目標機支援這個功能,它試圖重新排列指令,以便消除因資料未緒造成的執行
停頓.這可以幫助浮點運算或記憶體訪問 較慢的機器調取指令,允許其他指令先執行,
直到調取指令或浮點運算完成.

-fschedule-insns2

類似於`-fschedule-insns'選項,但是在暫存器分配完成後,需要一個額外的指令調
度過程.對於 暫存器數目相對較少,而且取記憶體指令大於一個週期的機器,這個選項
特別有用.



目標機選項(TARGET OPTION)

預設情況下, GNU CC編譯出本機型別的目標碼.然而也可以把他安裝成交叉編譯器,
為其他機型編譯程式.事實上,針對不同的目標機,可以同時安裝GNU CC相應的配置
然後用`-b'選項指定 目標機種.

順便提一下,新版本和舊版本的GNU CC可以共存.其中一個版本(可能是最新的那個)
為預設版本,但是有時候你希望使用 其他版本.

-b machine

引數machine指出編譯的目標機種.這個選項用於安裝為交叉編譯器的GNU CC.

引數machine的值和配置GNU CC交叉編譯器時設定的機器型別一樣.例如,如果交叉編
譯器配置有 `configure i386v',意思是編譯80386上的System V目標碼,那麼你可以
透過`-b i386v'執行交叉編譯器.

如果沒有指定`-b'選項,通常指編譯本機目標碼.

-V version

引數version指出執行哪個版本的GNU CC.這個選項用於安裝了多個版本的GCC.例如
,如果 version是`2.0',意味著執行GNU CC 2.0版.

如果沒有指定`-V'選項,預設版本取決於GNU CC的安裝方式,一般說來推薦使用通用
版本.



機器相關選項(MACHINE DEPENDENT OPTION)

每一種目標機型都有自己的特別選項,這些選項用`-m '開關引導,選擇不同的硬體型
號或配置---例如, 68010還是68020,有沒有浮點協處理器.透過指定選項,安裝 編譯
器的一個版本能夠為所有的型號或配置進行編譯.

此外,編譯器的某些配置支援附加的特殊選項,通常是為了在命令列上相容這個平臺
的其他編譯器.

下面是針對68000系列定義的`-m'選項:

-m68000

-mc68000

輸出68000的目標碼.如果編譯器按基於68000的系統配置,這個選項就是預設選項.


-m68020

-mc68020

輸出68020的目標碼(而不是68000).如果編譯器按基於68020的系統配置,這個選項就
是預設選項.

-m68881

輸出包含68881浮點指令的目標碼.對於大多數基於68020的系統這是預設選項,除非
設定編譯器時指定了 -nfp .

-m68030

輸出68030的目標碼.如果編譯器按基於68030的系統配置,這個選項就是預設選項.


-m68040

輸出68040的目標碼.如果編譯器按基於68040的系統配置,這個選項就是預設選項.


-m68020-40

輸出68040的目標碼,但是不使用新指令.生成的程式碼可以在68020/68881上,也可以在
68030或 68040上較有效地執行.

-mfpa

輸出包含SUN FPA浮點指令的目標碼.

-msoft-float

輸出包含浮點庫呼叫的目標碼. 警告:所需的庫不是GNU CC的組成部分.一般說來GC
C使用該機型本地C 編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自
己管理提供合適的函式庫用於交叉編譯.

-mshort

認為int型別是16位寬,相當於short int.

-mnobitfield

不使用位域(bit-field)指令. `-m68000'隱含指定了`-mnobitfield'.

-mbitfield

使用位域指令. `-m68020'隱含指定了`-mbitfield'.如果你使用未改裝的gcc,這就
是 預設選項.

-mrtd

採用另一種函式呼叫約定,函式接受固定數目的引數,用rtd指令返回,該指令返回時
彈出棧內的引數.這個 方法能夠使呼叫者節省一條指令,因為他這裡不需要彈出引數


這種呼叫約定不相容UNIX的正常呼叫.因此如果你需要呼叫UNIX編譯器編譯的庫函式
,你就不能使用這個選項.

此外,所有引數數量可變地函式必須提供函式原型(包括printf);否則編譯器會生成
錯誤的呼叫程式碼.

另外,如果呼叫函式時攜帶了過多的引數,編譯器將生成嚴重錯誤的程式碼. (正常情況
下,多餘的引數被安全無害的忽略.)

68010和68020處理器支援rtd指令,但是68000不支援.

下面是針對VAX定義的`-m'選項:

-munix

禁止輸出某些跳轉指令(aobleq等等), VAX的UNIX彙編器無法跨越長範圍(long ran
ges) 進行處理.

-mgnu

如果使用GNU彙編器,則輸出那些跳轉指令,

-mg

輸出g-format浮點數,取代d-format.

下面是SPARC支援的`-m'選項開關:

-mfpu

-mhard-float

輸出包含浮點指令的目標碼.這是預設選項.

-mno-fpu

-msoft-float

輸出包含浮點庫呼叫的目標碼. 警告:沒有為SPARC提供GNU浮點庫.一般說來使用該
機型本地C編譯器 的相應部件,但是不能直接用於交叉編譯.你必須自己安排,提供用
於交叉編譯的庫函式.

-msoft-float改變了輸出檔案中的呼叫約定;因此只有用這個選項編譯整個程式才有
意義.

-mno-epilogue

-mepilogue

使用-mepilogue (預設)選項時,編譯器總是把函式的退出程式碼放在函式的尾部.任何
在函式中間 的退出語句(例如C中的return語句)將產生出跳轉指令指向函式尾部.


使用-mno-epilogue選項時,編譯器儘量在每個函式退出點嵌入退出程式碼.

-mno-v8

-mv8

-msparclite

這三個選項選擇不同種類的SPARC系統.

預設情況下(除非特別為Fujitsu SPARClite配置), GCC生成SPARC v7目標碼.

-mv8生成SPARC v8目標碼.他和v7目標碼唯一的區別是,編譯器生成整數乘法和整數
除法指令, SPARC v8支援該指令,而v7體系不支援.

-msparclite生成SPARClite目標碼.增加了SPARClite支援的整數乘法,整數除法單步
掃描 (integer divide step and scan (ffs))指令. v7體系不支援這些指令.

-mcypress

-msupersparc

這兩個選項選擇處理器型號,針對處理器進行程式碼最佳化.

-mcypress選項(預設項)使編譯器對Cypress CY7C602晶片最佳化程式碼, SparcStation
/SparcServer 3xx系列使用這種晶片.該選項也適用於老式的SparcStation 1, 2,
IPX 等機型..

-msupersparc選項使編譯器對SuperSparc處理器最佳化程式碼, SparcStation 10, 100
0 和2000系列使用這種晶片.同時該選項啟用完整的SPARC v8指令集.

下面是針對Convex定義的`-m'選項:

-mc1

輸出C1的目標碼.當編譯器對C1配置時,這是預設選項.

-mc2

輸出C2的目標碼.當編譯器對C2配置時,這是預設選項.

-margcount

在每個引數列表的前面放置一個引數計數字(argument count word).某些不可移植
的Convex和Vax 程式需要這個引數計數字. (偵錯程式不需要他,除非函式帶有變長參
數列表;這個資訊存放在符號表中.)

-mnoargcount

忽略引數計數字.如果你使用未改裝的gcc,這是預設選項.

下面是針對AMD Am29000定義的`-m'選項:

-mdw

生成的目標碼認為DW置位,就是說,位元組和半字操作由硬體直接支援.該選項是預設選
項.

-mnodw

生成的目標碼認為DW沒有置位.

-mbw

生成的目標碼認為系統支援位元組和半字寫操作.該選項是預設選項.

-mnbw

生成的目標碼認為系統不支援位元組和半字寫操作.該選項隱含開啟了`-mnodw'選項.


-msmall

使用小記憶體模式,小記憶體模式假設所有函式的地址位於某個256 KB段內,或者所有函
數的絕對地址小於256K.這樣 就可以用call指令代替const, consth, calli指令序
列.

-mlarge

假設不能使用call指令;這是預設選項.

-m29050

輸出Am29050的目標碼.

-m29000

輸出Am29000的目標碼.這是預設選項.

-mkernel-registers

生成的目標碼引用gr64-gr95暫存器而不是gr96-gr127暫存器.該選項可以用於編譯
核心程式碼,核心需要一組全域性暫存器,這些全域性暫存器和使用者模式使用的暫存器完全
無關.

注意,使用這個選項時, `-f'選項中的暫存器名字必須是normal, user-mode, name
s.

-muser-registers

使用普通全域性暫存器集gr96-gr127.這是預設選項.

-mstack-check

在每次堆疊調整後插入一條__msp_check呼叫.這個選項常用於核心程式碼.

下面是針對Motorola 88K體系定義的`-m'選項:

-m88000

生成的目標碼可以在m88100和m88110上正常工作.

-m88100

生成的目標碼在m88100上工作的最好,但也可以在m88110上執行.

-m88110

生成的目標碼在m88110上工作的最好,可能不能在m88100上執行.

-midentify-revision

在彙編器的輸出端包含一條ident指令,記錄原始檔名,編譯器名字和版本,時標,以及
使用的編譯選項,

-mno-underscores

在彙編器的輸出端,符號名字前面不新增下劃線.預設情況是在每個名字前面增加下
劃線字首.

-mno-check-zero-division

-mcheck-zero-division

早期型號的88K系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些
選項可以避免包含(或可以 顯明包含)附加的程式碼,這些程式碼能夠檢查除零錯,傳送例
外訊號. GCC所有88K的配置預設使用 `-mcheck-zero-division'選項.

-mocs-debug-info

-mno-ocs-debug-info

包含(或忽略)附加的除錯資訊(關於每個棧架結構中暫存器的使用), 88Open Objec
t Compatibility Standard, ``OCS'',對此資訊做了說明. GDB不需要這些額外資訊
DG/UX, SVr4,和Delta 88 SVr3.2的預設配置是包含除錯資訊,其他88k機型的預設
配置是忽略這個資訊.

-mocs-frame-position

-mno-ocs-frame-position

強制(或不要求)把暫存器值儲存到棧架結構中的指定位置(按OCS的說明). DG/UX,
Delta88 SVr3.2和 BCS的預設配置使用`-mocs-frame-position'選項;其他88k機型
的預設配置是 `-mno-ocs-frame-position'.

-moptimize-arg-area

-mno-optimize-arg-area

控制如何在堆疊結構中儲存函式引數. `-moptimize-arg-area'節省空間,但是有可
能宕掉某些 偵錯程式(不是GDB). `-mno-optimize-arg-area'證實比標準選項好.預設
情況下GCC不最佳化引數域.

-mshort-data-

num透過和r0關聯,產生較小的資料引用(data reference),這樣就可以用單指令調入
一個數值(而不是平常的雙指令).使用者透過選項中的num控制改變哪種資料引用.例
如,如果你指定了 `-mshort-data-512',那麼受影響的資料引用是小於512位元組的數
據移動. -mshort-data-num選項對大於64K的num 無效.

-mserialize-volatile

-mno-serialize-volatile

產生,或不產生程式碼來保證對易變記憶體訪問的結果一致.

對於常用的處理器子型號, GNU CC始終預設保證這種一致性.如何實現結果一致取決
於處理器子型號.

m88100處理器不對記憶體引用重新安排,因此訪問結果始終一致.如果使用了`-m88100
'選項, GNU CC 不產生任何針對結果一致的特別指令.

m88110處理器的記憶體引用順序並不始終符合指令請求的引用順序.特別是某條讀取指
令可能在先前的儲存指令之前執行. 多處理器環境下,亂序訪問擾亂了易變記憶體訪問
的結果一致.因此當使用`-m88000'或`-m88110' 選項時, GNU CC在適當的時候產生
特別的指令迫使執行順序正確.

這些用於保證一致性的額外程式碼有可能影響程式的效能.如果你確認能夠安全地放棄
這種保證,你可以使用 `-mno-serialize-volatile'選項.

如果你使用`-m88100'選項,但是需要在m88110處理器上執行時的結果一致,你應該加
上 `-mserialize-volatile'選項.

-msvr4

-msvr3

開啟(`-msvr4')或關閉(`-msvr3')和System V第四版(SVr4)相關的 編譯器擴充套件.效
果如下:

*

輸出哪種彙編語法(你可以使用`-mversion-03.00'選項單獨選擇).

*

`-msvr4'使C前處理器識別`#pragma weak'指令

*

`-msvr4'使GCC輸出額外的宣告指令(declaration directive),用於SVr4.

除了SVr4配置, `-msvr3'是所有m88K配置的預設選項.

-mtrap-large-shift

-mhandle-large-shift

包含一些指令,用於檢測大於31位的位移(bit-shift);根據相應的選項,對這樣的位
移發出自陷 (trap)或執行適當的處理程式碼.預設情況下, GCC對大位移不做特別處理


-muse-div-instruction

很早以前的88K型號沒有(div)除法指令,因此預設情況下GCC避免產生這條指令.而這
個選項告訴GCC該指令是 安全的.

-mversion-03.00

在DG/UX配置中存在兩種風格的SVr4.這個選項修改-msvr4 ,選擇hybrid-COFF或 re
al-ELF風格.其他配置均忽略該選項.

-mwarn-passed-structs

如果某個函式把結構當做引數或結果傳遞, GCC發出警告.隨著C語言的發展,人們已
經改變了傳遞結構的約定, 它往往導致移植問題.預設情況下, GCC不會發出警告.


下面的選項用於IBM RS6000:

-mfp-in-toc

-mno-fp-in-toc

控制是否把浮點常量放到內容表(TOC)中,內容表存放所有的全域性變數和函式地址.默
認情況下, GCC把浮點常量放到 這裡;如果TOC溢位, `-mno-fp-in-toc'選項能夠減
少TOC的大小,這樣就可以避免溢位.

下面的`-m'選項用於IBM RT PC:

-min-line-mul

對於整數乘法使用嵌入程式碼.這是預設選項.

-mcall-lib-mul

對於整數乘法使用lmul$$ .

-mfull-fp-blocks

生成全尺寸浮點資料塊,包括IBM建議的最少數量的活動空間(scratch space).這是
預設選項.

-mminimum-fp-blocks

不要在浮點資料塊中包括額外的活動空間.這樣就產生較小但是略慢的可執行程式,
因為活動空間必須動態分配.

-mfp-arg-in-fpregs

採用不相容IBM呼叫約定的呼叫序列,透過浮點暫存器傳送浮點引數.注意,如果指定
了這個選項, varargs.h和stdargs.h將無法支援浮點單元.

-mfp-arg-in-gregs

使用正常的呼叫約定處理浮點引數.這是預設選項.

-mhc-struct-return

透過記憶體返回大於一個字的結構,而不是透過暫存器.用於相容MetaWare HighC (hc
)編譯器.使用 `-fpcc-struct-return'選項可以相容Portable C編譯器(pcc).

-mnohc-struct-return

如果可以,透過暫存器返回某些大於一個字的結構.這是預設選項.如果打算相容IBM
提供的編譯器,請使用 `-fpcc-struct-return'或`-mhc-struct-return'選項.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-944410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章