Linux on POWER 中的 GNU C/C 工具链(2)
2008-02-23 05:41:12来源:互联网 阅读 ()
c99, c9x, iso9899:1999, or iso9899:199x ISO C99 (并不完全支持)
gnu89 ISO C90 with GNU extensions(默认)
gnu99 或 gnu9x ISO C99 with GNU extensions
c 98 Amended 1998 ISO C standard
gnu 98 Amended 1998 ISO C standard, with GNU extensions (默认)
更新标准的特性假如和以前的 C 标准并不冲突,那就能够使用。即使不指定 -std= 标记,情况也是如此。例如,即使不指定 -std=c99,也能够使用 __restrict__ ,条件是他不会和所指定的旧标准冲突。
有一些更加具体的标记,例如 -fno-asm,能够用来强制是否遵从某种标准。这种类型的标记提供了一些强制关键字、通用有符号数据类型,并能够显示数据元素是保存在二进制文档的什么地方,连同其他一些信息。关于 C 和 C 的 dialect 选项的完整信息,请分别参阅 GCC 手册的 3.4 节和 3.5 节(请参阅 参考资料)。
除了 ANSI 标准之外,GCC 还支持 GNU 对 C 和 C 语言的一些扩展,这些扩展在 ANSI 标准中并不支持。在本文中并没有对这些扩展过多进行讨论,但是假如研发人员希望自己的代码能够在其他 GNU 平台之间能够很好地移植,我们强烈建议研发人员要了解这些区别。在下面的 清单 1 中给出了一个主要的扩展,这是因为这种用法很常见,而且这是个很好的可移植扩展的例子。
GNU 扩展能够使用前后的双下划线进行标记。例如,__asm__ 就是 GNU 对 asm 的扩展,他能够在规范中允许指令的操作数使用 C 表达式。
现在请考虑下面这个例子,他来自于 Linux 内核的源代码,使用了 GNU 的扩展:
清单 1. GNU 扩展
static __inline__ void atomic_sub(int a, atomic_t *v)
{
int t;
__asm__ __volatile__(
"1: lwarx %0,0,%3 # atomic_sub\n\
subf %0,%2,%0\n"
PPC405_ERR77(0,%3)
" stwcx. %0,0,%3 \n\
bne- 1b"
: "=&r" (t), "=m" (v->counter)
: "r" (a), "r" (&v->counter), "m" (v->counter)
: "cc");
}
注意,在这个例子中使用了 inline、asm 和 volatile 关键字的另外一种可替代形式:前后都使用了双下划线。
__GNUC__ 宏定义通常是为 GCC 进行预定义的,能够用来检查在编译代码时是否使用了对 GNU 扩展的支持。您能够认为这就像是在询问某一个编译器是否是 GCC 相同。我们建议您使用 GNU 的扩展关键字来检查是否存在 GNU 扩展,从而确保和其他编译器的可移植能力。例如:
#ifndef __GNUC__
#define __asm__ asm
#endif
这会检查是否存在 GNU 的扩展,假如不存在,就将后面的代码中会出现的一些关键字定义为其他编译器能够识别的关键字。
当使用 pedantic 警告信息调用 GNU 编译器时,任何的 GNU 扩展都会被报告为警告信息。通过在任何使用 GNU 扩展关键字的表达式之前都加上 __extension__ 关键字,能够解决这个问题。
记住,这是 GNU 扩展及其用法的一个例子。其他编译器也有很多特性,其中有一些都是类似的非标准特性。严谨的研发计划包括对这些扩展在可移植性和性能影响方面的理解。在 GCC 手册中完整介绍了任何的可用扩展。(请参阅 参考资料。)
警告选项
GCC 在报告错误消息时能够使用不同的粒度。在 GCC 手册中的 3.8 节列出了警告和错误选项。请参阅 参考资料。)除了能够打开或关闭每种类型的警告信息之外, 更有几个元选项来控制警告和错误消息的类型。这样能够让编译器进行一些严格的检查。
-fsyntax-only 选项会通知编译器只关心那些真正不符合语法规发的地方。这是编译器最松散的一种状态,和 -pedantic 选项正好相反。
-pedantic 选项会产生选定的 ISO 标准所希望的任何警告信息。这个标记还会禁用扩展,__keywords__ 和以 __extension__ 标识符开始的表达式除外。-pedantic-errors 选项会导致编译器编译器在碰到每个警告信息时就停止,仿佛碰到的是个错误。
-Wall 现象会使用很多警告信息,但是只有警告信息,没有其他信息。-Wall 究竟会产生哪些消息是个经验问题。正如在 GCC 手册中介绍的相同,这个选项 " 会启用任何有关那些某些用户认为存在问题而且很容易避免的结构的警告信息 " 请参阅 参考资料)。-Wextra 选项则会通知编译器要报告任何其他认为可能较少出现问题的警告消息。在 GCC 手册的 3.8 节中,能够看到这些标记能够捕获到的任何警告信息的完整清单。(请参阅 参考资料。)
假如一个标准能够同时使用 -std= 选项和 -pedantic 选项来测试代码是否遵守某个标准,那会很有吸引力。然而,这在实践中却并不怎样。虽然 -pedantic 选项实际上会对标准所希望产生警告的每个结构都产生警告信息,但是他并没有解决标准中的任何情况,因此他会替换成实际的标准遵守测试。
调试选项
交互式调试程式能够极大地加速代码中问题的分析。GNU Project Debugger,或称为 gdb,能够在程式中任何给定的地点停止,跟踪程式的执行过程,检查程式执行过程中到底发生了什么;假如程式没有正常结束,还能够修改程式的执行过程。
为了在 Linux on POWER 上使用 gdb,必须使用调试选项来编译代码。在使用 -g 或 -ggdb 选项编译代码时,会产生 DWARF 和 DWARF2 格式的信息。-pedantic 标记会产生 DWARF 信息供 gdb 使用。但是和大部分调试器不同,gdb 能够同时使用 -g 和 -O 标记(基本优化标记)。这是 gdb 特有的一个特性,在其他很多调试器中都没有这个特性,因为经过优化之后,代码的组织和执行都会发生变化。然而您也要有所准备,因为同时使用 -O 和 -g 会可能对代码重新进行调整,这在使用调试器时会受到影响。假如给 GCC 传递 -ggdb 选项,GDB 就能够使用意义更加丰富的 DWARF 2 格式。这同时会启用 gdb 的扩展。
-g 和 -ggbd 选项都能够接受一个级别参数(例如,-ggdb1 标识级别 1)。从直观上来看,这个级别越高(一共有 3 个),调试器中能够使用的调试信息就越多。这是个折中:调试信息越多,程式就越大,执行速度也就越慢。gcc 更有很多标记能够用来进行配置。这包括 gprof 和 gcov 用来搜集数据的一些选项,连同用来报告内存使用情况、优化信息的标记,等等。很多这种选项通常都是用来调试程式的,而不是用来编译代码的。最后一组调试标记是有关编译环境的。诸如 -print-file-name= 之类的选项用来验证所提供的编译环境是不是我们所希望的环境。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇: GCC 4.0 的新特性
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
