﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ivaneeo's blog-随笔分类-gcc小试牛力</title><link>http://www.blogjava.net/ivanwan/category/2558.html</link><description>自由的力量，自由的生活。</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:40:18 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:40:18 GMT</pubDate><ttl>60</ttl><item><title>如何在cygwin用gcc编译</title><link>http://www.blogjava.net/ivanwan/archive/2006/02/17/31302.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Fri, 17 Feb 2006 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/02/17/31302.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/31302.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/02/17/31302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/31302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/31302.html</trackback:ping><description><![CDATA[在cygwin/gcc下编译出来的程序，在windows执行必须依赖cygwin1.dll，并且速度有些慢，如果不想依赖这个东西的化，必须在gcc的编译选项中加入-mno-cygwin。<br>加入这个选项其实gcc编译器就会自动的选择在安装cygwin/gcc时安上的mingw,这个mingw就是gcc的一个交叉编译。<br><br>如果要程序没有控制台的话,只加上参数-mwindows就可以了.<br><img src ="http://www.blogjava.net/ivanwan/aggbug/31302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-02-17 22:00 <a href="http://www.blogjava.net/ivanwan/archive/2006/02/17/31302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc警告和出错消选项</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9338.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9338.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9338.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9338.html</trackback:ping><description><![CDATA[不符合ANSI/ISO的源代码<br>
/*<br>
*&nbsp;&nbsp;pedant.c - use -ansi, -pedantic or 
-pedantic-errors<br>
*/<br>
#include &lt;stdio.h&gt;<br>
void 
main(void)<br>
{<br>
&nbsp;&nbsp;long long int i = 0l;<br>
&nbsp;&nbsp;printf("This is a non-conforming 
c program\n");<br>
}<br>
使用gcc pedant.c -o 
pedant这个命令时,编译器会警告main函数的返回类型无效:<br>
$gcc pedant.c -o pedant<br>
pedant.c:In 
function 'main':<br>
pedant.c:7 warning:return type of 'main' is not 
'int'<br>
现在给gcc加上-ansi选项:<br>
$gcc -ansi pedant.c -o pedant<br>
$gcc pedant.c -o 
pedant<br>
pedant.c: In function 'main'<br>
pedant.c:7 warning: return type of 
'main' is not 
'int'<br>
gcc再次给出了同样的警告信息,并忽略了无效的数据类型.<br>
<br>
-ansi,-pedantic以及-pedantic-errors编译选项并不能保证被编译的程序的ANSI/ISO兼容性,它们仅被用来帮助程序员离这个目标更近.<br>
<br>
$gcc 
-Wall pedant.c -o pedant<br>
pedant.c:7: warning: return type of 'main' is not 
'int'<br>
pedant.c: In function 'main':<br>
pedant.c:8 warning: unused variable 
'i'<br>
-Wall系列选项的另一个极端是-w选项，它能关闭所有的警告信息。-W{warning}选项的作用是打开warning所指出的用户感兴趣的特殊警
告信息,比如隐身函数说明(-Wimplicit-function-declaration)或者隐身声明返回类型的函数(-Wreturn-
type).前者的作用在于它提示出定义了一个函数却没有事先声明或者忘记了包含适当的头文件.后者的作用在于指出声明的函数可能没有指定它的返回类型,
此时默认的返回类型为int.<br>
<br>
提示:如果只想检查语法而实际上不做如何编译工作,那么可以调用带有-fsyntax-only参数的GCC.<br>
<br>
选项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
说明<br>
-Wcomment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
如果出现了注解嵌套(在第一个/*之后又出现了第二个/*)则发出警告<br>
-Wformat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果传递给printf及及其相关函数
的参数和对应的格式字符串中指定的类型不平配则发出警告<br>
-Wmain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果main的返回类型不
是int或者调用main时使用的参数数目不正确则不出警告<br>
-Wparentheses&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
如果在出现了赋值(例如,(n=10))的地方使用了括号,而那里根据前后关系推断应该是比较(例如,(n==100))而非赋值的时候,或者如果括号能够解决运算优先级问题的时候,发出警告<br>
-Wswitch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果swtich语句少了它的一个或多
个枚举值的case分支(只有索引值是enum类型时才适用)则发出警告<br>
-Wunused&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果声明的变量没有使用,或者函数声明
为static类型但却从未使用,则发出警告<br>
-Wuninitialized&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
如果使用的自动变量没有初始化则发出警告<br>
-Wundef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
如果在#if宏中使用了未定义的变量作判断则发出警告<br>
-Winline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果函数不能被内联则发出警告<br>
-Wmissing-declarations&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果定义了全局函数但却没有在任何头文件中声明它,则发出警告<br>
-Wlong-long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
如果使用了long long类型则发出警告<br>
-Werror&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
将所有的警告转变为错误<br>
<br>
<br>
常见的编程错误:<br>
/*<br>
*&nbsp;&nbsp;blunder.c - Mistakes caught by 
-W(warning)<br>
*/<br>
#include &lt;stdio.h&gt;<br>
#include 
&lt;stdlib.h&gt;<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
&nbsp;&nbsp;int i, 
j;<br>
&nbsp;&nbsp;printf("%c\n", "not a character");&nbsp;&nbsp;/* -Wformat */<br>
&nbsp;&nbsp;if(i =
10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
-Wparenthesses */<br>
&nbsp;&nbsp;&nbsp;&nbsp;printf("oops\n");<br>
&nbsp;&nbsp;if(j !=
10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* -Wuninitialized */<br>
&nbsp;&nbsp;&nbsp;&nbsp;printf("another oops\n");<br>
&nbsp;&nbsp;/* /*
*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
-Wcomment */<br>
&nbsp;&nbsp;no_decl();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
-Wmissing-declaration */<br>
&nbsp;&nbsp;return (EXIT_SUCCESS);<br>
}<br>
<br>
void 
no_decl(void)<br>
{<br>
&nbsp;&nbsp;printf("no_decl\n");<br>
}<br>
$gcc blunder.c -o 
blunder<br>
blunder.c:27: warning: type mismatch with previous implicit 
declaration<br>
blunder.c:21: warning: previous implicit declaration of 
'no_decl'<br>
blunder.c:27: warning: 'no_decl' was previously implicitly declared 
to return 
'int'<br>
gcc只发出了和隐式声明no_decl函数有关的警告.它忽略了其他潜在的错误,这些错误包括:<br>
.传递给printf的参数类型(一个字符串)和格式化字符串定义的类型(一个字符)不匹配.这会产生一个-Wformat警告.<br>
.变量i和j使用前都没有初始化.它们中的任何一个都产生-Wuninitialized警告.<br>
.在根据前后关系推断应该对变量i的值做比较的地方,却对变量i进行赋值.这应该会产生一个-Wparentheses警告.<br>
.在注释嵌套开始的地方应该会产生一个-Wcomment警告.<img src ="http://www.blogjava.net/ivanwan/aggbug/9338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 22:03 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc函数库和包含文件</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9337.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 14:02:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9337.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9337.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9337.html</trackback:ping><description><![CDATA[例如,如果已经在/home/fred/include 下保存了自定义的头文件,那么为了让gcc能够找到它们,可按下面的例子使用-I选项:<br>
$gcc 
myapp.c -I /home/fred/include -o 
myapp<br>
-L选项对库文件起的作用和-I选项告诉gcc把DIRNAME添加到库文件搜索路径里,要保证DIRNAME比标准位置先被搜索.<br>
&nbsp;&nbsp;假设读者需要测试一个新的编程库libnew.so,当前它保存在/home/fred/lib下(.so是共享库文件的标准扩展名).为了链接库文件,gcc命令行应与下面类似:<br>
$gcc 
myapp.c -L/home/fred/lib -lnew -o 
myapp<br>
-L/home/fred/lib结构让gcc先在/home/fred/lib下查找库文件,然后再到默认的库文件搜索路径下进行查找.-l选项使得链
接程序使用指定的函数库中的目标代码,也就是本例中的libnew.so.把函数库命名为lib{名字}是UNIX的约定,与许多其他编译器一样,gcc
也遵循此约定.如果忘了使用-l选项,则与库的链接将失败,并且gcc产生错误,说明程序中引用了未定义的函数名.<br>
默认情况下,gcc使用共享库进行链接,所以在需要链接静态库时必须使用-static选项来保证只使用静态库.<br>
$gcc 
cursesapp.c -lncurses -static -o 
cursesapp<br>
在链接静态库时,可执行程序的大小比链接共享库要达很多.使用共享库时,程序所使用的代码是在运行时动态链接,而不是在编译时静态链接,因此,如果所需要的共享库没有在用户系统中安装,运行就会失败.<img src ="http://www.blogjava.net/ivanwan/aggbug/9337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 22:02 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc的Hello World</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9335.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9335.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9335.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9335.html</trackback:ping><description><![CDATA[实例代码:<br>
/*<br>
*&nbsp;&nbsp;hello.c - Canonical "Hello, World!" program<br>
*/<br>
#include 
&lt;stdio.h&gt;<br>
int main(void)<br>
{<br>
&nbsp;&nbsp;printf("Hello,Linux programming 
world!\n");<br>
&nbsp;&nbsp;return 0;<br>
}<br>
在命令行上键入以下命令编译和运行这段程序:<br>
$gcc hello.c -o 
hello<br>
$./hello<br>
Hello, Linux programming 
world!<br>
第一行命令告诉gcc对源代码hello.c进行编译和链接,并使用-o参数指定创建名为hello的可见程序.第二行命令执行hello这个程序,第三行是程序的执行结果.<br>
<br>
其实,gcc首先运行预处理程序cpp来展开hello.c中的宏并在其中插入#include文件所包含的内容:然后把预处理后的源代码编译成为目标代码;最后,链接程序ld创建一个名为hello的二进制文件.<br>
<br>
现在我们来通过手工操作重新创建这些步骤,以逐步执行编译过程.第一布是运行预处理器.使用-E选项告诉gcc在预处理后停止编译过程:<br>
$gcc 
-E hello.c -o 
hello.cpp<br>
此时查看hello.cpp会发现stdio.h的内容确实都插到文件里去了,而其他应当被预处理的标记也做了类似处理.<br>
下一步是将hello.cpp编译为目标代码.可使用gcc的-c选项来完成:<br>
$gcc 
-x cpp-output -c hello.cpp -o 
hello.o<br>
-x选项告诉gcc从指定的步骤开始编译,在本例中也就是编译器处理后的源代码(cpp-output).<br>
gcc是怎么知道如何处理某种特殊类型的文件呢?它是依靠文件的扩展名来决定如何正确处理该文件的.<br>
——————————————————————————————<br>
扩展名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型<br>
.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;C语言源代码<br>
.C,.cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C++语言源代码<br>
.i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;预处理后的C源代码<br>
.ii&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
预处理后的C++源代码<br>
.S,.s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
汇编语言源代码<br>
.o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;编译后的目标代码<br>
.a,.so&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后的库代码<br>
———————————————————————————————<br>
最后,链接目标文件,生成二进制代码.<br>
$gcc 
hello.c -o hello<img src ="http://www.blogjava.net/ivanwan/aggbug/9335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 22:01 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc的常用命令行选项</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9336.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9336.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9336.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9336.html</trackback:ping><description><![CDATA[选项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明<br>
-o FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定输出文件名,在编译为目标代码时,这一选项不 
是必须的.如果FILE没有指定,默认文件名时a.out<br>
-c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
只编译不链接<br>
-DFOO=BAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在命令行定义预处理宏FOO,其值为BAR<br>
-IDIRNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将DIRNAME加入到包含文件的搜索目录列表中<br>
-LDIRNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将DIRNAME加入到库文件的搜索目录列表中<br>
-static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;链接静态库,即执行静态链接默认情况下gcc只链接共享库<br>
-IFOO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;链接名为libFOO的函数库<br>
-g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
在可执行程序中包含标准调试信息<br>
-ggdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在可执行程序中包含只有GNU 
debugger(gdb)才能识别大量调试信息<br>
-O&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
优化编译过的代码<br>
-ON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定代码优化的级别为N,0&lt;=N&lt;=
3,如果未指定N,则默认级别为1<br>
-ansi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;支持ANSI/ISO 
C的标准语法,取消GNU的语法扩展中与该标准有冲突部分(但这一选项并不能保证生成ANSI兼容的代码)<br>
-pedantic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许发出ANSI/ISO 
C标准所列出的所有警告<br>
-pedantic-errors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许发出ANSI/ISO 
C标准所列出的所有错误<br>
-traditional&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持Kernighan &amp; Ritchie C 语法 
(如用旧式语法定义函数).<br>
-w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
关闭所有警告,建议不要使用此项<br>
-Wall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许发出gcc能提供的所有有用的警告.也可以用-W{warning}来标
记指定的警告<br>
-werror&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把所有警告转换为错误,以在警告发生时中止编译过程<br>
-MM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输出一个make兼容的相关列表<br>
-v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
显示在编译过程的每一步中用到的命令<img src ="http://www.blogjava.net/ivanwan/aggbug/9336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 22:01 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc编译过程</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9334.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9334.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9334.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9334.html</trackback:ping><description><![CDATA[gcc编译过程分为4个阶段:(源代理*.c)<br>
.预处理(和头文件*.h)<br>
.适当编译(生成目标代理*.o)<br>
.汇编<br>
.链接(和引导代码,库代码)<img src ="http://www.blogjava.net/ivanwan/aggbug/9334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 22:00 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc的其他调试技巧</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9333.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9333.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9333.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9333.html</trackback:ping><description><![CDATA[其他的调试选项包括-p和-pg,它们将剖析(profiling)信息加入二进制文件中.这些信息对于找出代码中的性能瓶颈以及开发高性能的程序非常有
帮助.-p选项在代码中加入prof程序能够读取的剖析符合信息,而-pg选项加入了GNU项目中prof的化身gprof能够解释的符合信息.-a选项
在代码中加入代码块(比如函数)累计使用的次数.<br>
<br>
-save-temps选项可以保存在编译过程中生成的中间文件,其中包括目标文件和汇编代码文件.<br>
<br>
如果你对编译器到底花费了多少时间来完成它的工作感兴趣,可以考虑使用-Q选项,这个选项让gcc显示编译过程中碰到的每个函数,并提供编译器编译每个函数所花时间的剖析信息.<img src ="http://www.blogjava.net/ivanwan/aggbug/9333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:59 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc调试选项的实例</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9332.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9332.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9332.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9332.html</trackback:ping><description><![CDATA[$gcc -g hello.c -o hello<br>
$ls -l hello<br>
-rwxr-xr-x 1 kwall users 10275 May 
21 23:27 hello<br>
<br>
$gcc -ggdb hello.c -o hello<br>
$ls -l hello<br>
-rwxr-xr-x 
1 kwall users 8135 May 21 23:28 
hello<br>
<br>
-g选项让二进制文件大小增长到将近三倍,而-ggdb选项也让其大小增加了一倍!尽管会使文件大小增长,仍然建议在执行文件中包含标准的调试符合(使用-g选项创建),以便某些用户在遇到问题时可以调试你的代码.<img src ="http://www.blogjava.net/ivanwan/aggbug/9332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:58 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc调试选项</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9330.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9330.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9330.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9330.html</trackback:ping><description><![CDATA[使用gcc的-g和-ggdb选项在编译后的程序中插入调试信息以方面调试会话过程.能够用1,2或3来限定-g选项来指定产生多少调试信息.默认的级别
是2(-g2),此时的产生的调试信息包括扩展的符号表,行号以及局部或外部变量的信息.这些信息全部保存在二进制文件里.3级调试信息包括所有的2级信
息和源代码中定义的所有宏.相反,1级产生的信息只够创建回溯(backtrace)和堆栈转储(stack dump)之用.<br>
<br>
回溯是指一个程序调用函数的历史.堆栈转储是一个通常以原始的十六机制格式保存程序执行环境内容的列表,列表内容主要是CPU寄存器和分配给程序的内存.注意,1级调试不产生局部变量和行号的调试信息.<img src ="http://www.blogjava.net/ivanwan/aggbug/9330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:57 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc的优化选项</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9331.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9331.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9331.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9331.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gcc优化标志<br>
选项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作用<br>
-ffloat-store&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
禁止在CPU的寄存器中保存浮点变量的值.这能把CPU寄存器节省下来留作它用,而且可以防止产生过分精确但不必要的浮点数.<br>
-ffast-math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
产生浮点数学优化,这能提高速度但违反了IEEE或ANSI/ISO标准.如果程序不需要严格遵守IEEE规范,可在编译浮点密集型的程序时考虑采用这一标志<br>
-finline-functions&nbsp;&nbsp;&nbsp;&nbsp;把所有的"简单"函数在调用它们的函数中就地展开.编译器决定了什么是"简单"函数.减少处理器与函数相关的开销是一种基本的优化技术<br>
-funroll-loops&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;展开所有能在编译时确定重复次数的循环体.展开循环体后每步循环都能省出几条CPU指令,这样大大减少了执行时间<br>
-fomit-frame-pointer&nbsp;&nbsp;如果函数不需要则丢掉指针,该指针保存在CPU的一个寄存器中.因为去掉了设置,保存和恢复帧指针所必需的指令,所以加快了处理速度.<br>
-fschedule-insns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记录可能暂停的指令,因为它们正在等候的数据不在CPU中<br>
-fschedule-insns2&nbsp;&nbsp;&nbsp;&nbsp; 
执行第二次指令重排序(类似于-fschedule-insns)<br>
-fmove-all-movables&nbsp;&nbsp; 
把所有出现在循环体内部但稳定不变的计算移出循环体.这从循环体中去除了不必要的操作,加快了循环的整体运算速度.<br>
<br>
内联和循环展开技术都能够大大提高程序的执行速度,因为它们都避免了函数调用和变量查找的开销,但付出的代价往往是大大增加了目标或二进制代码的大小.<br>
<br>
一般而言,Linux程序员似乎爱用优化选项-O2.<img src ="http://www.blogjava.net/ivanwan/aggbug/9331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:57 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pgcc:奔腾处理器的编译器</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9328.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9328.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9328.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9328.html</trackback:ping><description><![CDATA[pgcc的主要好处是它对Pentium处理器的优化较好.<img src ="http://www.blogjava.net/ivanwan/aggbug/9328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:56 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc优化实例</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9329.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9329.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9329.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9329.html</trackback:ping><description><![CDATA[计算pi的平方根<br>
/*<br>
*&nbsp;&nbsp;pisqrt.c - Calculate the square of PI 
100,000,000<br>
*/<br>
#include &lt;stdio.h&gt;<br>
#include 
&lt;math.h&gt;<br>
<br>
int main(void)<br>
{<br>
&nbsp;&nbsp;double pi = M_PI; /* Defined in 
&lt;math.h&gt; */<br>
&nbsp;&nbsp;double pisqrt;<br>
&nbsp;&nbsp;long i;<br>
<br>
&nbsp;&nbsp;for(i = 0; i &lt; 
10000000; ++i) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;pisqrt = sqrt(pi);<br>
&nbsp;&nbsp;}<br>
&nbsp;&nbsp;return 
0;<br>
}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pisqrt的执行时间<br>
标志/优化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;平均执行时间<br>
&lt;none&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5.43s<br>
-O1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.74s<br>
-O2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.83s<br>
-O3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.76s<br>
-ffloat-store&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.41s<br>
-ffast-math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.46s<br>
-funroll-loops&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
5.44s<br>
-fschedule-insns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
5.45s<br>
-fschedule-insns2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.44s<br>
<br>
这个例子说明,除非对处理器的体系结构非常了解或者知道某种特殊的优化专门针对你的程序有影响,否则就应该使用优化选项-O.<img src ="http://www.blogjava.net/ivanwan/aggbug/9329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:56 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GNU C扩展</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/04/9327.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/04/9327.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/9327.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/04/9327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/9327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/9327.html</trackback:ping><description><![CDATA[1.关于可移植性<br>
#ifdef __STRICT_ANSI__<br>
/* use ANSI/ISO C only here 
*/<br>
#else<br>
/* use GNU extensions here 
*/<br>
#endif<br>
如果用户或是ANSI兼容的编译器定义了__STRICT_ANSI__宏,则表明需施加ANSI兼容的环境,并编译#ifdef语句块的第一部分代码.否则,编译#else后面的代码.<br>
2.GNU扩展<br>
&nbsp;&nbsp;gcc使用long 
long 类型来提供64位储存单元:<br>
&nbsp;&nbsp;long long 
long_int_var;<br>
内联函数<br>
&nbsp;&nbsp;要使用内联函数,需在函数的返回类型前面插入关键字inline,如下面的代码片段所示,还要在编译时使用-O优化选项.<br>
&nbsp;&nbsp;inline 
void swap(int *a, int *b)<br>
&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;int tmp = *a;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*a = *b;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*b 
= 
tmp;<br>
&nbsp;&nbsp;}<br>
函数和变量属性<br>
&nbsp;&nbsp;关键字attribute通过向gcc指明有关代码的更多信息来帮助代码优化工作进行得更好.例如,标准库函数exit和
abort都不返回调用它们的函数.编译器如果知道它们不返回就能生成效率稍高的代码.当然用户程序也能定义不返回的函数.gcc允许为这些函数指定
noreturn属性,作为编译器在优化该函数时的提示.<br>
&nbsp;&nbsp;<br>
例如,假设有个没有返回的函数die_on_error.为了使用函数属性,可以在函数声明后面加上__attribute__((attribute_name)).于是函数die_on_error的声明如下:<br>
&nbsp;&nbsp;void 
die_on_error(void) __attribute__ ((noreturn));<br>
函数还和平常一样来定义:<br>
&nbsp;&nbsp;#include 
&lt;stdlib.h&gt;<br>
&nbsp;&nbsp;void die_on_error(void)<br>
&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* your code here 
*/<br>
&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>
&nbsp;&nbsp;}<br>
<br>
也可以对变量指定属性.例如,aligned属性指示编译器在为变量分配内存空间时按指定字节数对齐边界.下列语句:<br>
&nbsp;&nbsp;int 
int_var __attribute__ ((aligned 16)) = 
0;<br>
使gcc让变量int_var的边界按16字节对齐.packed属性告诉gcc为变量或结构分配最小的内存空间.<br>
<br>
如果想要关闭对未用变量发出的所有警告,那么可以对变量使用unused属性,它告诉编译器该变量不准备使用.下面的变量声明会消除警告:<br>
&nbsp;&nbsp;float 
big_salary __attribute__ 
((unused));<br>
<br>
使用case区间<br>
case区间是一个非常有用的扩展.其语法如下:<br>
&nbsp;&nbsp;case LOWVAL ... 
LOWVAL:<br>
注意,在省略号前后必须有空格.在switch语句中,case区间指定了落在LOWVAL和HIVAL区间内的那些整数值.例如:<br>
&nbsp;&nbsp;switch(int_var) 
{<br>
&nbsp;&nbsp;case 0 ... 2:<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* your code here */<br>
&nbsp;&nbsp;&nbsp;&nbsp;break;<br>
&nbsp;&nbsp;case 3 ... 
5:<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* more code here */<br>
&nbsp;&nbsp;&nbsp;&nbsp;break;<br>
&nbsp;&nbsp;default:<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* default 
code here 
*/<br>
&nbsp;&nbsp;}<br>
<br>
构造函数名称<br>
&nbsp;&nbsp;把函数名用作字符串是GNU的扩展,它能极大地简化调试工作.gcc预先定义了变量__FUNCTION__为当前函数(控制流程当前所在的位置)的名字,就好像它被写在源代码里去了一样.<br>
<br>
使用__FUNCTION__变量<br>
/*<br>
*&nbsp;&nbsp;showit.c 
- Illustrate using the __FUNCTION__ variable<br>
*/<br>
#include 
&lt;stdio.h&gt;<br>
<br>
void foo(void);<br>
<br>
int 
main(void)<br>
{<br>
&nbsp;&nbsp;printf("The current function is %s\n", 
__FUNCTION__);<br>
&nbsp;&nbsp;foo();<br>
&nbsp;&nbsp;return 0;<br>
}<br>
<br>
void 
foo(void)<br>
{<br>
&nbsp;&nbsp;printf("The current function is %s\n", __FUNCTION__);<br>
}<img src ="http://www.blogjava.net/ivanwan/aggbug/9327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:55 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/04/9327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>