Linux下C编程基础之:gcc编译器
-pedantic-error | 允许发出ANSI C标准所列的全部错误信息 |
-w | 关闭所有告警 |
-Wall | 允许发出gcc提供的所有有用的报警信息 |
-werror | 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 |
下面结合实例对这几个告警和出错选项进行简单的讲解。
有以下程序段:
#include<stdio.h>
void main()
{
long long tmp = 1;
printf("This is a bad code!\n");
return 0;
}
这是一个很糟糕的程序,读者可以考虑一下有哪些问题。
n "-ansi"
该选项强制gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。运行结果如下所示:
[root@localhost gcc]# gcc –ansi warning.c –o warning
warning.c: 在函数"main"中:
warning.c:7 警告:在无返回值的函数中,"return"带返回值
warning.c:4 警告:"main"的返回类型不是"int"
可以看出,该选项并没有发现"long long"这个无效数据类型的错误。
n "-pedantic"
打印ANSI C标准所列出的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。其运行结果如下所示:
[root@localhost gcc]# gcc –pedantic warning.c –o warning
warning.c: 在函数"main"中:
warning.c:5 警告:ISO C90不支持"long long"
warning.c:7 警告:在无返回值的函数中,"return"带返回值
warning.c:4 警告:"main"的返回类型不是"int"
可以看出,使用该选项查出了"long long"这个无效数据类型的错误。
n "-Wall"
打印gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示:
[root@localhost gcc]# gcc –Wall warning.c –o warning
warning.c:4 警告:"main"的返回类型不是"int"
warning.c: 在函数"main"中:
warning.c:7 警告:在无返回值的函数中,"return"带返回值
warning.c:5 警告:未使用的变量"tmp"
使用"-Wall"选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。
另外,gcc还可以利用选项对单独的常见错误分别指定警告。
(4)优化选项。
gcc可以对代码进行优化,它通过编译选项"-On"来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。
不同的优化级别对应不同的优化处理工作。如使用优化选项"-O"主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项"-O2"除了完成所有"-O1"级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项"-O3"则还包括循环展开和其他一些与处理器特性相关的优化工作。
虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。
(5)体系结构相关选项。
gcc的体系结构相关选项如表3.10所示。
表3.10 gcc体系结构相关选项列表
选 项 | 含 义 |
-mcpu=type | 针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等 |
-mieee-fp | 使用IEEE标准进行浮点数的比较 |
-mno-ieee-fp | 不使用IEEE标准进行浮点数的比较 |
-msoft-float | 输出包含浮点库调用的目标代码 |
-mshort | 把int类型作为16位处理,相当于short int |
-mrtd | 强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令 |
这些体系结构相关选项在嵌入式的设计中会有较多的应用,读者需根据不同体系结构将对应的选项进行组合处理。在本书后面涉及具体实例时将会有针对性的讲解。
- Linux下C编程基础之:常用编辑器(08-13)
- Linux下C编程基础之:gdb调试器(08-13)
- Linux下C编程基础之:make工程管理器(08-13)
- Linux下C编程基础之:使用autotools(08-13)
- Linux下C编程基础之:实验内容(08-13)
- Linux下C编程基础之:本章小结与思考与练习(08-13)