GCC
Section: GNU Tools (1) Updated: 2003/12/05 IndexReturn to Main Contents
?
?
NAME
gcc,g++-GNU
工程的
C
和
C++
編譯器
(egcs-1.1.2) ?
總覽
(SYNOPSIS)
gcc[option|filename ]... g++[option|filename ]...
警告
(WARNING)
本手冊(cè)頁(yè)內(nèi)容摘自
GNU C
編譯器的完整文檔
,
僅限于解釋選項(xiàng)的含義
.
除非有人自愿維護(hù)
,
否則本手冊(cè)頁(yè)不再更新
.
如果發(fā)現(xiàn)手冊(cè)頁(yè)和軟件之間有所矛盾
,
請(qǐng)查對(duì)
Info
文件
, Info
文件是權(quán)威文檔
.
如果我們發(fā)覺(jué)本手冊(cè)頁(yè)的內(nèi)容由于過(guò)時(shí)而導(dǎo)致明顯的混亂和抱怨時(shí)
,
我們就停止發(fā)布它
.
不可能有其他選擇
,
象更新
Info
文件同時(shí)更新
man
手冊(cè)
,
因?yàn)槠渌S護(hù)
GNU CC
的工作沒(méi)有留給我們時(shí)間做這個(gè)
. GNU
工程認(rèn)為
man
手冊(cè)是過(guò)時(shí)產(chǎn)物
,
應(yīng)該把時(shí)間用到別的地方
.
如果需要完整和最新的文檔
,
請(qǐng)查閱
Info
文件
`gcc'
或
Using and Porting GNU CC (for version 2.0) (
使用和移植
GNU CC 2.0)
手冊(cè)
.
二者均來(lái)自
Texinfo
原文件
gcc.texinfo.
描述
(DESCRIPTION)
C
和
C++
編譯器是集成的
.
他們都要用四個(gè)步驟中的一個(gè)或多個(gè)處理輸入文件
:
預(yù)處理
(preprocessing),
編譯
(compilation),
匯編
(assembly)
和連接
(linking).
源文件后綴名標(biāo)識(shí)源文件的 語(yǔ)言
,
但是對(duì)編譯器來(lái)說(shuō)
,
后綴名控制著缺省設(shè)定
:
-
gcc
-
認(rèn)為預(yù)處理后的文件
(.i)
是
C
文件
,
并且設(shè)定
C
形式的連接
.
-
g++
-
認(rèn)為預(yù)處理后的文件
(.i)
是
C++
文件
,
并且設(shè)定
C++
形式的連接
.
源文件后綴名指出語(yǔ)言種類以及后期的操作
:
?
.c C
源程序
;
預(yù)處理
,
編譯
,
匯編
.C C++
源程序
;
預(yù)處理
,
編譯
,
匯編
.cc C++
源程序
;
預(yù)處理
,
編譯
,
匯編
.cxx C++
源程序
;
預(yù)處理
,
編譯
,
匯編
.m Objective-C
源程序
;
預(yù)處理
,
編譯
,
匯編
.i
預(yù)處理后的
C
文件
;
編譯
,
匯編
.ii
預(yù)處理后的
C++
文件
;
編譯
,
匯編
.s
匯編語(yǔ)言源程序
;
匯編
.S
匯編語(yǔ)言源程序
;
預(yù)處理
,
匯編
.h
預(yù)處理器文件
;
通常不出現(xiàn)在命令行上
其他后綴名的文件被傳遞給連接器
(linker).
通常包括
:
?
.o
目標(biāo)文件
(Object file).a
歸檔庫(kù)文件
(Archive file)
除非使用了
-c, -S,
或
-E
選項(xiàng)
(
或者編譯錯(cuò)誤阻止了完整的過(guò)程
),
否則連接總是 最后的步驟
.
在連接階段中
,
所有對(duì)應(yīng)于源程序的
.o
文件
, -l
庫(kù)文件
,
無(wú)法識(shí)別的文件名
(
包括指定的
.o
目標(biāo)文件和
.a
庫(kù)文件
)
按命令行中的順序傳遞給連接器
.
選項(xiàng)
(OPTIONS)
選項(xiàng)必須分立給出
: `-dr'
完全不同于
`-d -r '.
大多數(shù)
`-f'
和
`-W'
選項(xiàng)有兩個(gè)相反的格式
: -fname
和
-fno-
name (
或
-W
name
和
-Wno-
name).
這里 只列舉不是默認(rèn)選項(xiàng)的格式
.
下面是所有選項(xiàng)的摘要
,
按類型分組
,
解釋放在后面的章節(jié)中
.
-
總體選項(xiàng)
(Overall Option)
-
-c -S -E -o file -pipe -v -x language
-
語(yǔ)言選項(xiàng)
(Language Option)
-
-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs
-
警告選項(xiàng)
(Warning Option)
-
-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings
-
調(diào)試選項(xiàng)
(Debugging Option)
-
-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program
-
優(yōu)化選項(xiàng)
(Optimization Option)
-
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3
-
預(yù)處理器選項(xiàng)
(Preprocessor Option)
-
-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef
-
匯編器選項(xiàng)
(Assembler Option)
-
-Wa,option
-
連接器選項(xiàng)
(Linker Option)
-
-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker?option -Wl,option -u symbol
-
目錄選項(xiàng)
(Directory Option)
-
-Bprefix -Idir -I- -Ldir
-
目標(biāo)機(jī)選項(xiàng)
(Target Option)
-
-b machine -V version
-
配置相關(guān)選項(xiàng)
(Configuration Dependent Option)
-
M680x0?
選項(xiàng)
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float
VAX
選項(xiàng)
-mg -mgnu -munix
SPARC
選項(xiàng)
-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress
Convex
選項(xiàng)
-margcount -mc1 -mc2 -mnoargcount
AMD29K
選項(xiàng)
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers
M88K
選項(xiàng)
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs
RS6000
選項(xiàng)
-mfp-in-toc -mno-fop-in-toc
RT
選項(xiàng)
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return
MIPS
選項(xiàng)
-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp
i386
選項(xiàng)
-m486 -mno-486 -msoft-float -mno-fp-ret-in-387
HPPA
選項(xiàng)
-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon
i960
選項(xiàng)
-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align
DEC Alpha
選項(xiàng)
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float
System V
選項(xiàng)
-G -Qy -Qn -YP,paths -Ym,dir
-
代碼生成選項(xiàng)
(Code Generation Option)
-
-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm
?
總體選項(xiàng)
(Overall Option)
-
-x
language
-
明確指出后面輸入文件的語(yǔ)言為
language (
而不是從文件名后綴得到的默認(rèn)選擇
).
這個(gè)選項(xiàng)應(yīng)用于后面 所有的輸入文件
,
直到遇著下一個(gè)
`-x'
選項(xiàng)
. language
的可選值有
`c', `objective-c', `c-header', `c++', `cpp-output', `assembler',
和
`assembler-with-cpp'.
-
-x none
-
關(guān)閉任何對(duì)語(yǔ)種的明確說(shuō)明
,
因此依據(jù)文件名后綴處理后面的文件
(
就象是從未使用過(guò)
`-x'
選項(xiàng)
).
如果只操作四個(gè)階段
(
預(yù)處理
,
編譯
,
匯編
,
連接
)
中的一部分
,
可以使用
`-x'
選項(xiàng)
(
或文件名后綴
)
告訴
gcc
從哪里開(kāi)始
,
用
`-c', `-S',
或
`-E'
選項(xiàng)告訴
gcc
到 哪里結(jié)束
.
注意
,
某些選項(xiàng)組合
(
例如
, `-x cpp-output -E')
使
gcc
不作任何事情
.
-
-c
-
編譯或匯編源文件
,
但是不作連接
.
編譯器輸出對(duì)應(yīng)于源文件的目標(biāo)文件
.
缺省情況下
, GCC
通過(guò)用
`.o'
替換源文件名后綴
`.c', `.i', `.s',
等等
,
產(chǎn)生目標(biāo)文件名
.
可以使用
-o
選項(xiàng)選擇其他名字
.
GCC
忽略
-c
選項(xiàng)后面任何無(wú)法識(shí)別的輸入文件
(
他們不需要編譯或匯編
).
-
-S
-
編譯后即停止
,
不進(jìn)行匯編
.
對(duì)于每個(gè)輸入的非匯編語(yǔ)言文件
,
輸出文件是匯編語(yǔ)言文件
.
缺省情況下
, GCC
通過(guò)用
`.o'
替換源文件名后綴
`.c', `.i',
等等
,
產(chǎn)生 目標(biāo)文件名
.
可以使用
-o
選項(xiàng)選擇其他名字
.
GCC
忽略任何不需要編譯的輸入文件
.
-
-E
-
預(yù)處理后即停止
,
不進(jìn)行編譯
.
預(yù)處理后的代碼送往標(biāo)準(zhǔn)輸出
.
GCC
忽略任何不需要預(yù)處理的輸入文件
.
-
-o
file
-
指定輸出文件為
file.
該選項(xiàng)不在乎
GCC
產(chǎn)生什么輸出
,
無(wú)論是可執(zhí)行文件
,
目標(biāo)文件
,
匯編文件還是 預(yù)處理后的
C
代碼
.
由于只能指定一個(gè)輸出文件
,
因此編譯多個(gè)輸入文件時(shí)
,
使用
`-o'
選項(xiàng)沒(méi)有意義
,
除非輸出一個(gè)可執(zhí)行文件
.
如果沒(méi)有使用
`-o'
選項(xiàng)
,
默認(rèn)的輸出結(jié)果是
:
可執(zhí)行文件為
`a.out', `source.suffix '
的目標(biāo)文件是
`source.o',
匯編文件是
`source.s',
而預(yù)處理后的
C
源代碼送往標(biāo)準(zhǔn)輸出
.
-
-v
-
(
在標(biāo)準(zhǔn)錯(cuò)誤
)
顯示執(zhí)行編譯階段的命令
.
同時(shí)顯示編譯器驅(qū)動(dòng)程序
,
預(yù)處理器
,
編譯器的版本號(hào)
.
-
-pipe
-
在編譯過(guò)程的不同階段間使用管道而非臨時(shí)文件進(jìn)行通信
.
這個(gè)選項(xiàng)在某些系統(tǒng)上無(wú)法工作
,
因?yàn)槟切┫到y(tǒng)的 匯編器不能從管道讀取數(shù)據(jù)
. GNU
的匯編器沒(méi)有這個(gè)問(wèn)題
.
?
語(yǔ)言選項(xiàng)
(LANGUAGE OPTIONS)
下列選項(xiàng)控制編譯器能夠接受的
C "
方言
":
-
-ansi
-
支持符合
ANSI
標(biāo)準(zhǔn)的
C
程序
.
這樣就會(huì)關(guān)閉
GNU C
中某些不兼容
ANSI C
的特性
,
例如
asm, inline
和
typeof
關(guān)鍵字
,
以及諸如
unix
和
vax
這些表明當(dāng)前系統(tǒng)類型的預(yù)定義宏
.
同時(shí)開(kāi)啟 不受歡迎和極少使用的
ANSI trigraph
特性
,
以及禁止
`$'
成為標(biāo)識(shí)符的一部分
.
?
盡管使用了
`-ansi'
選項(xiàng)
,
下面這些可選的關(guān)鍵字
, __asm__, __extension__, __inline__
和
__typeof__
仍然有效
.
你當(dāng)然不會(huì)把 他們用在
ANSI C
程序中
,
但可以把他們放在頭文件里
,
因?yàn)榫幾g包含這些頭文件的程序時(shí)
,
可能會(huì)指定
`-ansi'
選項(xiàng)
.
另外一些預(yù)定義宏
,
如
__unix__
和
__vax__,
無(wú)論有沒(méi)有使用
`-ansi'
選項(xiàng)
,
始終有效
.
?
使用
`-ansi'
選項(xiàng)不會(huì)自動(dòng)拒絕編譯非
ANSI
程序
,
除非增加
`-pedantic'
選項(xiàng)作為
`-ansi'
選項(xiàng)的補(bǔ)充
.
?
使用
`-ansi'
選項(xiàng)的時(shí)候
,
預(yù)處理器會(huì)預(yù)定義一個(gè)
__STRICT_ANSI__
宏
.
有些頭文件 關(guān)注此宏
,
以避免聲明某些函數(shù)
,
或者避免定義某些宏
,
這些函數(shù)和宏不被
ANSI
標(biāo)準(zhǔn)調(diào)用
;
這樣就不會(huì)干擾在其他地方 使用這些名字的程序了
.
?
-
-fno-asm
-
不把
asm, inline
或
typeof
當(dāng)作關(guān)鍵字
,
因此這些詞可以用做標(biāo)識(shí)符
.
用
__asm__, __inline__
和
__typeof__
能夠替代他們
. `-ansi'
隱含聲明了
`-fno-asm'.
-
-fno-builtin
-
不接受不是兩個(gè)下劃線開(kāi)頭的內(nèi)建函數(shù)
(built-in function).
目前受影響的函數(shù)有
_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,
和
strlen.
`-ansi'
選項(xiàng)能夠阻止
alloca
和
_exit
成為內(nèi)建函數(shù)
.
?
-
-fhosted
-
按宿主環(huán)境編譯
;
他隱含聲明了
`-fbuiltin'
選項(xiàng)
,
而且警告不正確的
main
函數(shù)聲明
.
-
-ffreestanding
-
按獨(dú)立環(huán)境編譯
;
他隱含聲明了
`-fno-builtin'
選項(xiàng)
,
而且對(duì)
main
函數(shù)沒(méi)有特別要求
.
(
譯注
:
宿主環(huán)境
(hosted environment)
下所有的標(biāo)準(zhǔn)庫(kù)可用
, main
函數(shù)返回一個(gè)
int
值
,
典型例子是除了 內(nèi)核以外幾乎所有的程序
.
對(duì)應(yīng)的獨(dú)立環(huán)境
(freestanding environment)
不存在標(biāo)準(zhǔn)庫(kù)
,
程序入口也不一定是
main,
最明顯的例子就是操作系統(tǒng)內(nèi)核
.
詳情參考
gcc
網(wǎng)站最近的資料
)
?
-
-fno-strict-prototype
-
對(duì)于沒(méi)有參數(shù)的函數(shù)聲明
,
例如
`int foo ();',
按
C
風(fēng)格處理
---
即不說(shuō)明參數(shù)個(gè)數(shù)或類型
. (
僅針對(duì)
C++).
正常情況下
,
這樣的函數(shù)
foo
在
C++
中意味著參數(shù)為空
.
?
-
-trigraphs
-
支持
ANSI C trigraphs. `-ansi'
選項(xiàng)隱含聲明了
`-trigraphs'.
?
-
-traditional
-
試圖支持傳統(tǒng)
C
編譯器的某些方面
.
詳見(jiàn)
GNU C
手冊(cè)
,
我們已經(jīng)把細(xì)節(jié)清單從這里刪除
,
這樣當(dāng)內(nèi)容過(guò)時(shí)后
,
人們也不會(huì) 埋怨我們
.
除了一件事
:
對(duì)于
C++
程序
(
不是
C), `-traditional'
選項(xiàng)帶來(lái)一個(gè)附加效應(yīng)
,
允許對(duì)
this
賦值
.
他和
`-fthis-is-variable'
選項(xiàng)的效果一樣
.
?
-
-traditional-cpp
-
試圖支持傳統(tǒng)
C
預(yù)處理器的某些方面
.
特別是上面提到有關(guān)預(yù)處理器的內(nèi)容
,
但是不包括
`-traditional'
選項(xiàng)的其他效應(yīng)
.
?
-
-fdollars-in-identifiers
-
允許在標(biāo)識(shí)符
(identifier)
中使用
`$'
字符
(
僅針對(duì)
C++).
你可以指定
`-fno-dollars-in-identifiers'
選項(xiàng)顯明禁止使用
`$'
符
. (GNU C++
在某些 目標(biāo)系統(tǒng)缺省允許
`$'
符
,
但不是所有系統(tǒng)
.)
?
-
-fenum-int-equiv
-
允許
int
類型到枚舉類型
(enumeration)
的隱式轉(zhuǎn)換
(
僅限于
C++).
正常情況下
GNU C++
允許從
enum
到
int
的轉(zhuǎn)換
,
反之則不行
.
?
-
-fexternal-templates
-
為模板聲明
(template declaration)
產(chǎn)生較小的代碼
(
僅限于
C++),
方法是對(duì)于每個(gè)模板函數(shù)
(template function),
只在定義他們的地方生成一個(gè)副本
.
想要成功使用這個(gè)選項(xiàng)
,
你必須在所有使用模板的 文件中
,
標(biāo)記
`#pragma implementation' (
定義
)
或
`#pragma interface' (
聲明
).
當(dāng)程序用
`-fexternal-templates'
編譯時(shí)
,
模板實(shí)例
(template instantiation)
全部是外部類型
.
你必須讓需要的實(shí)例在實(shí)現(xiàn)文件中出現(xiàn)
.
可以通過(guò)
typedef
實(shí)現(xiàn)這一點(diǎn)
,
他引用所需的每個(gè) 實(shí)例
.
相對(duì)應(yīng)的
,
如果編譯時(shí)使用缺省選項(xiàng)
`-fno-external-templates',
所有模板實(shí)例明確的設(shè)為內(nèi)置
.
?
-
-fall-virtual
-
所有可能的成員函數(shù)默認(rèn)為虛函數(shù)
.
所有的成員函數(shù)
(
除了構(gòu)造子函數(shù)和
new
或
delete
成員操作符
)
視為所在類的虛函數(shù)
.
這不表明每次調(diào)用成員函數(shù)都將通過(guò)內(nèi)部虛函數(shù)表
.
有些情況下
,
編譯器能夠判斷出可以直接調(diào)用某個(gè)虛函數(shù)
;
這時(shí)就 直接調(diào)用
.
?
-
-fcond-mismatch
-
允許條件表達(dá)式的第二和第三個(gè)參數(shù)的類型不匹配
.
這種表達(dá)式的值是
void.
?
-
-fthis-is-variable
-
允許對(duì)
this
賦值
(
僅對(duì)
C++).
合并用戶自定義的自由存儲(chǔ)管理機(jī)制到
C++
后
,
使可賦值的
`this'
顯得不合時(shí)宜
.
因此
,
默認(rèn)情況下
,
類成員函數(shù)內(nèi)部對(duì)
this
賦值是無(wú)效操作
.
然而為了 向后兼容
,
你可以通過(guò)
`-fthis-is-variable'
選項(xiàng)使這種操作有效
.
?
-
-funsigned-char
-
把
char
定義為無(wú)符號(hào)類型
,
如同
unsigned char.
各種機(jī)器都有自己缺省的
char
類型
.
既可能是
unsigned char
也可能是
signed char .
理想情況下
,
當(dāng)依賴于數(shù)據(jù)的符號(hào)性時(shí)
,
一個(gè)可移植程序總是應(yīng)該使用
signed char
或
unsigned char.
但是許多程序已經(jīng)寫成只用簡(jiǎn)單的
char,
并且期待這是有符號(hào)數(shù)
(
或者無(wú)符號(hào)數(shù)
,
具體情況取決于 編寫程序的目標(biāo)機(jī)器
).
這個(gè)選項(xiàng)
,
和它的反義選項(xiàng)
,
使那樣的程序工作在對(duì)應(yīng)的默認(rèn)值上
.
char
的類型始終應(yīng)該明確定義為
signed char
或
unsigned char,
即使 它表現(xiàn)的和其中之一完全一樣
.
?
-
-fsigned-char
-
把
char
定義為有符號(hào)類型
,
如同
signed char.
這個(gè)選項(xiàng)等同于
`-fno-unsigned-char',
他是
the negative form of `-funsigned-char'
的相反選項(xiàng)
.
同樣
, `-fno-signed-char'
等價(jià)于
`-funsigned-char'.
?
-
-fsigned-bitfields
-
-
-funsigned-bitfields
-
-
-fno-signed-bitfields
-
-
-fno-unsigned-bitfields
-
如果沒(méi)有明確聲明
`signed'
或
`unsigned'
修飾符
,
這些選項(xiàng)用來(lái)定義有符號(hào)位域
(bitfield)
或無(wú)符號(hào)位域
.
缺省情況下
,
位域是有符號(hào)的
,
因?yàn)樗麄兝^承的基本整數(shù)類型
,
如
int,
是 有符號(hào)數(shù)
.
然而
,
如果指定了
`-traditional'
選項(xiàng)
,
位域永遠(yuǎn)是無(wú)符號(hào)數(shù)
.
?
-
-fwritable-strings
-
把字符串常量存儲(chǔ)到可寫數(shù)據(jù)段
,
而且不做特別對(duì)待
.
這是為了兼容一些老程序
,
他們假設(shè)字符串常量是可寫的
. `-traditional'
選項(xiàng)也有相同效果
.
篡改字符串常量是一個(gè)非常糟糕的想法
; ``
常量
''
就應(yīng)該是常量
.
?
預(yù)處理器選項(xiàng)
(Preprocessor Option)
下列選項(xiàng)針對(duì)
C
預(yù)處理器
,
預(yù)處理器用在正式編譯以前
,
對(duì)
C
源文件進(jìn)行某種處理
.
如果指定了
`-E'
選項(xiàng)
, GCC
只進(jìn)行預(yù)處理工作
.
下面的某些選項(xiàng)必須和
`-E'
選項(xiàng)一起才 有意義
,
因?yàn)樗麄兊妮敵鼋Y(jié)果不能用于編譯
.
?
-
-include
file
-
在處理常規(guī)輸入文件之前
,
首先處理文件
file,
其結(jié)果是
,
文件
file
的內(nèi)容先得到編譯
.
命令行上任何
`-D'
和
`-U'
選項(xiàng)永遠(yuǎn)在
`-include file'
之前處理
,
無(wú)論他們?cè)诿钚猩系捻樞蛉绾?/font>
.
然而
`-include'
和
`-imacros'
選項(xiàng)按書(shū)寫順序處理
.
?
-
-imacros
file
-
在處理常規(guī)輸入文件之前
,
首先處理文件
file,
但是忽略輸出結(jié)果
.
由于丟棄了文件
file
的 輸出內(nèi)容
, `-imacros file'
選項(xiàng)的唯一效果就是使文件
file
中的宏定義生效
,
可以用于其他輸入文件
.
在處理
`-imacrosfile'
選項(xiàng)之前
,
預(yù)處理器首先處理
`-D'
和
`-U'
選項(xiàng)
,
并不在乎他們?cè)诿钚猩系捻樞?/font>
.
然而
`-include'
和
`-imacros'
選項(xiàng)按書(shū)寫順序處理
.
?
-
-idirafter
dir
-
把目錄
dir
添加到第二包含路徑中
.
如果某個(gè)頭文件在主包含路徑
(
用
`-I'
添加的路徑
)
中沒(méi)有 找到
,
預(yù)處理器就搜索第二包含路徑
.
?
-
-iprefix
prefix
-
指定
prefix
作為后續(xù)
`-iwithprefix'
選項(xiàng)的前綴
.
?
-
-iwithprefix
dir
-
把目錄添加到第二包含路徑中
.
目錄名由
prefix
和
dir
合并而成
,
這里
prefix
被先前的
`-iprefix'
選項(xiàng)指定
.
?
-
-nostdinc
-
不要在標(biāo)準(zhǔn)系統(tǒng)目錄中尋找頭文件
.
只搜索
`-I'
選項(xiàng)指定的目錄
(
以及當(dāng)前目錄
,
如果合適
).
結(jié)合使用
`-nostdinc'
和
`-I-'
選項(xiàng).\\
內(nèi)嵌匯編語(yǔ)法如下: ?????? __asm__(匯編語(yǔ)句模板: 輸出部分: 輸入部分: 破壞描述部分) 共四個(gè)部分:匯編語(yǔ)句模板,輸出部分,輸入部分,破壞描述部分,各部分使用“:”格開(kāi),匯編語(yǔ)句模板必不可少,其他三部分可選,如果使用了后面的部分,而前面部分為空,也需要用“:”格開(kāi),相應(yīng)部分內(nèi)容為空。例如: ???????????? __asm__ __volatile__("cli": : :"memory")
1、匯編語(yǔ)句模板 ????匯編語(yǔ)句模板由匯編語(yǔ)句序列組成,語(yǔ)句之間使用“;”、“\n”或“\n\t”分開(kāi)。指令中的操作數(shù)可以使用占位符引用C語(yǔ)言變量,操作數(shù)占位符最多10個(gè),名稱如下:%0,%1,…,%9。指令中使用占位符表示的操作數(shù),總被視為long型(4個(gè)字節(jié)),但對(duì)其施加的操作根據(jù)指令可以是字或者字節(jié),當(dāng)把操作數(shù)當(dāng)作字或者字節(jié)使用時(shí),默認(rèn)為低字或者低字節(jié)。對(duì)字節(jié)操作可以顯式的指明是低字節(jié)還是次字節(jié)。方法是在%和序號(hào)之間插入一個(gè)字母,“b”代表低字節(jié),“h”代表高字節(jié),例如:%h1。
2、輸出部分 ????輸出部分描述輸出操作數(shù),不同的操作數(shù)描述符之間用逗號(hào)格開(kāi),每個(gè)操作數(shù)描述符由限定字符串和C 語(yǔ)言變量組成。每個(gè)輸出操作數(shù)的限定字符串必須包含“=”表示他是一個(gè)輸出操作數(shù)。 例: ??????????__asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) ) 描述符字符串表示對(duì)該變量的限制條件,這樣GCC 就可以根據(jù)這些條件決定如何分配寄存器,如何產(chǎn)生必要的代碼處理指令操作數(shù)與C表達(dá)式或C變量之間的聯(lián)系。
3、輸入部分 輸入部分描述輸入操作數(shù),不同的操作數(shù)描述符之間使用逗號(hào)格開(kāi),每個(gè)操作數(shù)描述符由限定字符串和C語(yǔ)言表達(dá)式或者C語(yǔ)言變量組成。 例1 : ????????????__asm__ __volatile__ ("lidt %0" : : "m" (real_mode_idt)); 例二(bitops.h): Static __inline__ void __set_bit(int nr, volatile void * addr) { ????????__asm__( ???????????????????????? "btsl %1,%0" ????????????????????????:"=m" (ADDR) ????????????????????????:"Ir" (nr)); } |
后例功能是將(*addr)的第nr位設(shè)為1。第一個(gè)占位符%0與C 語(yǔ)言變量ADDR對(duì)應(yīng),第二個(gè)占位符%1與C語(yǔ)言變量nr對(duì)應(yīng)。因此上面的匯編語(yǔ)句代碼與下面的偽代碼等價(jià):btsl nr, ADDR,該指令的兩個(gè)操作數(shù)不能全是內(nèi)存變量,因此將nr的限定字符串指定為“Ir”,將nr 與立即數(shù)或者寄存器相關(guān)聯(lián),這樣兩個(gè)操作數(shù)中只有ADDR為內(nèi)存變量。
4、限制字符 ?? 4.1、限制字符列表 ?? 限制字符有很多種,有些是與特定體系結(jié)構(gòu)相關(guān),此處僅列出常用的限定字符和i386中可能用到的一些常用的限定符。它們的作用是指示編譯器如何處理其后的C語(yǔ)言變量與指令操作數(shù)之間的關(guān)系。
?? 分類????????????限定符????????????????????描述 ??通用寄存器?????? “a”?????????????? 將輸入變量放入eax ??????????????????????????????????????????????這里有一個(gè)問(wèn)題:假設(shè)eax已經(jīng)被使用,那怎么辦? ???????????????????????????????? 其實(shí)很簡(jiǎn)單:因?yàn)镚CC 知道eax 已經(jīng)被使用,它在這段匯編代碼 ???????????????????????????????? 的起始處插入一條語(yǔ)句pushl %eax,將eax 內(nèi)容保存到堆棧,然 ???????????????????????????????? 后在這段代碼結(jié)束處再增加一條語(yǔ)句popl %eax,恢復(fù)eax的內(nèi)容 ?????????????????? “b”?????????????? 將輸入變量放入ebx ???????????????????????????? “c”?????????????? 將輸入變量放入ecx ????????????????????????????“d”????????????????將輸入變量放入edx ???????????????????????????? “s”?????????????? 將輸入變量放入esi ????????????????????????????“d”?????????????? 將輸入變量放入edi ???????????????????????????? “q”??????????????將輸入變量放入eax,ebx,ecx,edx中的一個(gè) ?????????????????? “r”?????????????? 將輸入變量放入通用寄存器,也就是eax,ebx,ecx, ????????????????????????????????????????edx,esi,edi中的一個(gè) ????????????????????“A”??????????????把eax和edx合成一個(gè)64 位的寄存器(use long longs)
?????? 內(nèi)存????????????“m”???????????? 內(nèi)存變量 ???????????????????? “o”???????????? 操作數(shù)為內(nèi)存變量,但是其尋址方式是偏移量類型, ?????????????????????????????????????? 也即是基址尋址,或者是基址加變址尋址 ???????????????????? “V”???????????? 操作數(shù)為內(nèi)存變量,但尋址方式不是偏移量類型 ???????????????????? “ ”???????????? 操作數(shù)為內(nèi)存變量,但尋址方式為自動(dòng)增量 ???????????????????? “p”???????????? 操作數(shù)是一個(gè)合法的內(nèi)存地址(指針)
???? 寄存器或內(nèi)存????“g”???????????? 將輸入變量放入eax,ebx,ecx,edx中的一個(gè) ?????????????????????????????????????? 或者作為內(nèi)存變量 ??????????????????????“X”????????????操作數(shù)可以是任何類型
???? 立即數(shù) ???????????????????? “I”???????????? 0-31之間的立即數(shù)(用于32位移位指令) ??????????????????????“J”????????????0-63之間的立即數(shù)(用于64位移位指令) ???????????????????? “N”???????????? 0-255之間的立即數(shù)(用于out指令) ???????????????????? “i”???????????? 立即數(shù)?? ???????????????????? “n”????????????立即數(shù),有些系統(tǒng)不支持除字以外的立即數(shù), ?????????????????????????????????????? 這些系統(tǒng)應(yīng)該使用“n”而不是“i”
???? 匹配????????????“ 0 ”,???????? 表示用它限制的操作數(shù)與某個(gè)指定的操作數(shù)匹配, ???????????????????? “1” ...?????????????? 也即該操作數(shù)就是指定的那個(gè)操作數(shù),例如“0” ??????????????????????“9”????????????去描述“%1”操作數(shù),那么“%1”引用的其實(shí)就 ?????????????????????????????????????? 是“%0”操作數(shù),注意作為限定符字母的0-9 與 ?????????????????????????????????????? 指令中的“%0”-“%9”的區(qū)別,前者描述操作數(shù), ?????????????????????????????????????? 后者代表操作數(shù)。 ?????????????????????? &???????????????????? 該輸出操作數(shù)不能使用過(guò)和輸入操作數(shù)相同的寄存器
????操作數(shù)類型????????“=”??????????操作數(shù)在指令中是只寫的(輸出操作數(shù))?? ?????????????????????? “+”??????????操作數(shù)在指令中是讀寫類型的(輸入輸出操作數(shù))
???? 浮點(diǎn)數(shù)????????????“f”??????????浮點(diǎn)寄存器 ??????????????????????“t”?????????? 第一個(gè)浮點(diǎn)寄存器 ??????????????????????“u”??????????第二個(gè)浮點(diǎn)寄存器 ??????????????????????“G”??????????標(biāo)準(zhǔn)的80387浮點(diǎn)常數(shù) ?????????????????????? %?????????????????? 該操作數(shù)可以和下一個(gè)操作數(shù)交換位置 ?????????????????????????????????????? 例如addl的兩個(gè)操作數(shù)可以交換順序 ??????????????????????????????????????(當(dāng)然兩個(gè)操作數(shù)都不能是立即數(shù)) ?????????????????????? #?????????????????? 部分注釋,從該字符到其后的逗號(hào)之間所有字母被忽略 ?????????????????????? *???????????????????? 表示如果選用寄存器,則其后的字母被忽略
5、破壞描述部分 ?? 破壞描述符用于通知編譯器我們使用了哪些寄存器或內(nèi)存,由逗號(hào)格開(kāi)的字符串組成,每個(gè)字符串描述一種情況,一般是寄存器名;除寄存器外還有“memory”。例如:“%eax”,“%ebx”,“memory”等。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。
|