正文

GCC中文使用手册(8)代码生成选项2005-12-08 13:04:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ddtme/8001.html

分享到:

代码生成选项(CODE GENERATION OPTION)

下面的选项和平台无关,用于控制目标码生成的接口约定.

大部分选项以`-f'开始.这些选项拥有确定和否定两种格式; `-ffoo'的否定格式是 `-fno-foo'.后面的描述将只列举其中的一个格式---非默认的格式.你可以通过添加或去掉 `no-'推测出另一个格式.

-fnonnull-objects
假设通过引用(reference)取得的对象不为null (仅C++).

一般说来, GNU C++对通过引用取得的对象作保守假设.例如,编译器一定会检查下似代码中的a不为 null:

obj &a = g (); a.f (2);

检查类似的引用需要额外的代码,然而对于很多程序是不必要的.如果你的程序不要求这种检查,你可以用 `-fnonnull-objects'选项忽略它.

-fpcc-struct-return
函数返回structunion值时,采用和本地编译器相同的参数约定.对于较小的结构, 这种约定的效率偏低,而且很多机器上不能重入;它的优点是允许GCC编译的目标码和PCC编译的目标码互相调用.

-freg-struct-return
一有可能就通过寄存器返回structunion函数值.对于较小的结构,它比 -fpcc-struct-return更有效率.

如果既没有指定-fpcc-struct-return ,也没有指定-freg-struct-return, GNU CC默认使用目标机的标准约定.如果没有标准约定, GNU CC默认采用-fpcc-struct-return.

-fshort-enums
enum类型只分配它声明的值域范围的字节数.就是说, enum类型等于大小足够的 最小整数类型.

-fshort-double
使double类型的大小和float一样.

-fshared-data
要求编译结果的数据和非const变量是共享数据,而不是私有数据.这种差别仅在某些操作系统上面有意义, 那里的共享数据在同一个程序的若干进程间共享,而私有数据在每个进程内都有副件.

-fno-common
即使未初始化的全局变量也分配在目标文件的bss段,而不是把它们当做普通块(common block)建立.这样的 结果是,如果在两个不同的编译结果中声明了同一个变量(没使用extern ),连接它们时会产生错误. 这个选项可能有用的唯一情况是,你希望确认程序能在其他系统上运行,而其他系统总是这么做.

-fno-ident
忽略`#ident'指令.

-fno-gnu-linker
不要把全局初始化部件(如C++的构造子和解构子)输出为GNU连接器使用的格式(在GNU连接器是标准方法的系统 上).当你打算使用非GNU连接器的时候可以用这个选项,非GNU连接器也需要collect2程序确保系统连接器 放入构造子(constructor)和解构子(destructor). (GNU CC的发布包中包含有collect2 程序.)对于必须使用collect2的系统,编译器驱动程序gcc自动配置为这么做.

-finhibit-size-directive
不要输出.size汇编指令,或其他类似指令,当某个函数一分为二,两部分在内存中距离很远时会引起问题. 当编译`crtstuff.c'时需要这个选项;其他情况下都不应该使用.

-fverbose-asm
输出汇编代码时放些额外的注释信息.这个选项仅用于确实需要阅读汇编输出的时候(可能调试编译器自己的时候).

-fvolatile
使编译器认为所有通过指针访问的内存是易变内存(volatile).

-fvolatile-global
使编译器认为所有的外部和全局变量是易变内存.

-fpic
如果支持这种目标机,编译器就生成位置无关目标码.适用于共享库(shared library).

-fPIC
如果支持这种目标机,编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围 转移.

-ffixed-reg
把名为reg的寄存器按固定寄存器看待(fixed register);生成的目标码不应该引用它(除了或许 用作栈指针,帧指针,或其他固定的角色).

reg必须是寄存器的名字.寄存器名字取决于机器,用机器描述宏文件的REGISTER_NAMES宏 定义.

这个选项没有否定格式,因为它列出三路选择.

-fcall-used-reg
把名为reg的寄存器按可分配寄存器看待,不能在函数调用间使用.可以临时使用或当做变量使用,生存期 不超过一个函数.这样编译的函数无需保存和恢复reg寄存器.

如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.

这个选项没有否定格式,因为它列出三路选择.

-fcall-saved-reg
把名为reg的寄存器按函数保护的可分配寄存器看待.可以临时使用或当做变量使用,它甚至能在函数间 生存.这样编译的函数会保存和恢复使用中的reg寄存器.

如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.

另一种灾难是用这个选项说明的寄存器返回函数值.

这个选项没有否定格式,因为它列出三路选择.

 

PRAGMAS

GNU C++支持两条`#pragma'指令使同一个头文件有两个用途:对象类的接口定义, 对象类完整的内容定义.

#pragma interface
(仅对C++)在定义对象类的头文件中,使用这个指令可以节省大部分采用该类的目标文件的大小.一般说来,某些信息 (内嵌成员函数的备份副件,调试信息,实现虚函数的内部表格等)的本地副件必须保存在包含类定义的各个目标文件中.使用这个 pragma指令能够避免这样的复制.当编译中引用包含`#pragma interface'指令的头文件时,就 不会产生这些辅助信息(除非输入的主文件使用了`#pragma implementation'指令).作为替代,目标文件 将包含可被连接时解析的引用(reference).

#pragma implementation
#pragma implementation "objects.h"
(仅对C++)如果要求从头文件产生完整的输出(并且全局可见),你应该在主输入文件中使用这条pragma.头文件 中应该依次使用`#pragma interface'指令.在implementation文件中将产生全部内嵌成员函数 的备份,调试信息,实现虚函数的内部表格等.

如果`#pragma implementation'不带参数,它指的是和源文件有相同基本名的包含文件;例如, `allclass.cc'中, `#pragma implementation'等于`#pragma implementation allclass.h'.如果某个implementation文件需要从多个头文件引入代码,就应该 使用这个字符串参数.

不可能把一个头文件里面的内容分割到多个implementation文件中.

 

文件(FILE)

file.c             C源文件
file.h             C头文件(预处理文件)
file.i            预处理后的C源文件
file.C             C++源文件
file.cc            C++源文件
file.cxx           C++源文件
file.m             Objective-C源文件
file.s            汇编语言文件
file.o            目标文件
a.out             连接的输出文件
TMPDIR/cc*        临时文件
LIBDIR/cpp        预处理器
LIBDIR/cc1         C编译器
LIBDIR/cc1plus     C++编译器
LIBDIR/collect    某些机器需要的连接器前端(front end)程序
LIBDIR/libgcc.a    GCC子例程(subroutine)库
/lib/crt[01n].o   启动例程(start-up)
LIBDIR/ccrt0       C++的附加启动例程
/lib/libc.a       标准C库,另见intro (3)
/usr/include       #include文件的标准目录
LIBDIR/include     #include文件的标准gcc目录
LIBDIR/g++-include #include文件的附加g++目录


LIBDIR通常为/usr/local/lib/machine/version.
TMPDIR来自环境变量TMPDIR (如果存在,缺省为/usr/tmp ,否则为 /tmp).

另见(SEE ALSO)

cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
info中 `gcc', `cpp', `as', `ld',和`gdb'的条目.
Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging with GDB: the GNU Source-Level Debugger, Richard M. Stallman和Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain和Roland Pesch.

BUGS

关于报告差错的指导请查阅GCC手册.

版权(COPYING)

Copyright 1991, 1992, 1993 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.

《中国Linux论坛man手册页翻译计划》

http://cmpp.linuxforum.net/


 

Index

NAME
总览 (SYNOPSIS)
警告 (WARNING)
描述 (DESCRIPTION)
选项 (OPTIONS)
总体选项 (Overall Option)
语言选项 (LANGUAGE OPTIONS)
预处理器选项 (Preprocessor Option)
汇编器选项 (ASSEMBLER OPTION)
连接器选项 (LINKER OPTION)
目录选项 (DIRECTORY OPTION)
警告选项 (WARNING OPTION)
调试选项 (DEBUGGING OPTION)
优化选项 (OPTIMIZATION OPTION)
目标机选项 (TARGET OPTION)
机器相关选项 (MACHINE DEPENDENT OPTION)
代码生成选项 (CODE GENERATION OPTION)
PRAGMAS
文件 (FILE)
另见 (SEE ALSO)
BUGS
版权 (COPYING)
作者 (AUTHORS)
[中文版维护人]
[中文版最新更新]
《中国Linux论坛man手册页翻译计划》

阅读(5438) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册