📄 2.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>20CN网络安全小组--makefile(2) </title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="keywords" content="黑客,安全,网络,编程,黑客软件,安全软件,hacker,UNIX,Linux,FreeBSD"><meta name="description" content="黑客,安全,网络,编程,黑客软件,安全软件,hacker,UNIX,Linux,FreeBSD"><STYLE type=text/css>A { font-size: 12px; color: 004d9c; TEXT-DECORATION: none}A:visited { TEXT-DECORATION: none}A:active { TEXT-DECORATION: none}A:hover { color: #0000FF; text-decoration: none}.9p { font-size: 12px }.10p { font-size: 10pt}.9pten { font-size: 9pt; font-family: "verdana, Helvetica, Times New Roman, sans-serif"}.textinfo { font-size: 10.5pt; font-family: "verdana, Helvetica, Times New Roman, 宋体, sans-serif"; line-height: 21px ;letter-spacing:}.code { font-size: 10pt; font-family: "Courier New, sans-serif"}</STYLE></head><body bgcolor="#FFFFFF" leftmargin="0" topmargin="4" marginwidth="0" marginheight="0"><div align="center"><table width="768" border="1" bordercolor="#FFFFFF" class="9p"> <tr> <td bordercolor="ffffff" colspan="2" bgcolor="ffffff" align="right"> <a href="http://www.20cn.net/aboutus.html">关于我们</a> | <a href="http://www.20cn.net/joinus.html">加入我们</a> | <a href="http://www.20cn.net/help.html">网站结构</a> | <a href="http://www.20cn.net/linkus.html">交换连接</a> | <a href="mailto:webmaster@20cn.com">联系我们</a> </td> </tr></table><table width="768" border="1" height="51" bordercolor="5296ff" class="9p"> <tr> <td height="43" bordercolor="ffffff" colspan="2" bgcolor="ffffff"> <table width="100%" bgcolor="ffffff" bordercolor="ffffff" cellpadding="0" cellspacing="0" border="0"> <tr> <td ><img src="http://www.20cn.net/images/logo.jpg"></td> <td width="%100" height="40" align="center"><img src="http://www.20cn.net/images/banner.gif"></td> </tr> </table> </td> </tr> <tr> <td width="559" height="23" align="center"> | <a href="http://www.20cn.net/ns/html/">最新文档</a> | <a href="http://www.20cn.net/ns/wz/">技术文摘</a> | <a href="http://www.20cn.net/ns/ld/">安全漏洞</a> | <a href="http://www.20cn.net/ns/cn/">菜鸟乐园</a> | <a href="http://www.20cn.net/ns/hk/">黑客进阶</a> | <a href="http://www.20cn.net/netdemon/">技术文库</a> | <a href="http://www.20cn.net/download/" target="_blank">软件下载</a> | <a href="http://www.20cn.net/club/" target="_blank">技术论坛</a> | </td> <td width="193" bgcolor="adcbef" height="23"> <div align="center"> <script language=JavaScript src="http://www.20cn.net/date.js"></script> </div> </td> </tr></table><!-- End Herder --> <table width="768" border="1" bordercolor="5296ff"> <tr> <td colspan="3" bordercolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" class="9p"> <tr> <td width="74%"> 您现在的位置 >> <a href="http://www.20cn.net/">返回首页</a></td> <td width="26%" align="center"> 文档发表时间:2002-08-01 </td> </table> </td> </tr> <tr valign="top"> <td colspan="3" bordercolor="#FFFFFF"> <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#adcbef" bordercolor="#adcbef"> <tr bgcolor="#F7F7F7" valign="top"> <td class="9p"> <table border="0" cellpadding="0" cellspacing="10" width="100%"> <tr> <td class="textinfo"> <p>makefile(2) <span style="font-size: 9pt">(阅览<font color="#FF0000"> <script src="http://www.20cn.net/cgi-bin/ns/count.cgi?id=20020801150927"></script> </font>次)</span></p> <p>makefile(2) <br><br> <br>作者:ermiao 发表时间:2002/07/09 09:14am<br> <br>标 题: 关于makefile(2) <br>1.3 怎样分解项目 <br> 先说明,这完全是我个人的意见,你可以(也许你真的会?)用别的方式来做。这会触 动到有关编码风格的问题,而大家从来就没有停止过在这个问题上的争论。在这里我只是给出我自己喜欢的做法(同时也给出这么做的原因): <br>i) 不要用一个 header 文件指向多个源码文件(例外:程序包 的 header 文件)。用一个 header定义一个源码文件的方式 会更有效,也更容易查寻。否则改变一个源文件的结构(并且 它的 header 文件)就必须重新编译好几个文件。 <br>ii) 如果可以的话,完全可以用超过一个的 header 文件来指向同 一个源码文件。有时将不可公开调用的函数原型,类型定义 等等,从它们的C源码文件中分离出来是非常有用的。使用一 个 header 文件装公开符号,用另一个装私人符号意味着如果 你改变了这个源码文件的内部结构,你可以只是重新编译它而 不需要重新编译那些使用它的公开 header 文件的其它的源文 件。 <br>iii) 不要在多个 header 文件中重复定义信息。 如果需要, 在其中一个 header 文件里 #include 另一个,但 是不要重复输入相同的 header 信息两次。原因是如果你 以后改 变了这个信息,你只需要把它改变一次,不用搜索并改变另外一 个重复的信 息。 <br>iv) 在每一个源码文件里, #include 那些声明了源码文件中的符 号的所有 header 文件。这样一来,你在源码文件和 header 文件对某些函数做出的矛盾声明可以比较容易的被编译器发现。 <br>1.4 对于常见错误的注释 <br>a) 定义符 (Identifier) 在源码文件中的矛盾:在C里,变量和函数的缺 省状态是公用的。因此,任何C源码档案都可以引用存在于其它源 码档中的通用 (global) 函数和通用变量,既使这个档案没有那个变 量或函数的声明或原型。因此你必须保证在不 同的两个档案里不能 用同一个符号名称,否则会有连接错误或者在编译时会有警告。 一种避免这种错误的方法是在公用的符号前加上跟其所在源文件有 关的前缀。比如: <br>所有在 gfx.c 里的函数都加上前缀“gfx_”。如果 你很小心的分解你的程序,使用有 意义的函数名称,并且不是过分 使用通用变量,当然这根本就不是问题。 要防止一个符号在它被定义的源文件以外被看到,可在它的定义前 加上关键字 “static”。这对只在一个档案内部使用,其它档案都 都不会用到的简单函数是很有用的。 <br>b) 多次定义的符号: header 档会被逐字的替换到你源文件里 #include 的位置的。 因此,如果 header 档被 #include 到一个以上的源文件 里,这个 header 档中所有 的定义就会出现在每一个有关的源码文件 里。这会使它们里的符号被定义一次以上, 从而出现连接错误(见 上)。 <br>解决方法: 不要在 header 档里定义变量。你只需要在 header 档里声明它们然后在 适当的C源码文件(应该 #include 那个 header 档的那个)里定义它们(一次)。对于初学者来说,定义和声明是 很容易混淆的。声明的作用是告诉编译器其所声明的符 号应该存在, 并且要有所指定的类型。但是,它并不会使编译器分配贮存空间。 而定 义的做用是要求编译器分配贮存空间。当做一个声明而不是做 定义的时候,在声明前放一个关键字“extern”。 例如,我们有一个叫“counter”的变量,如果想让它成为公用的, 我们在一个源码程 序(只在一个里面)的开始定义它:“int counter;”,再在相关的 header 档里声明 它:“extern int counter;”。 函数原型里隐含着 extern 的意思,所以不需顾虑这个问题。 <br>c) 重复定义,重复声明,矛盾类型: <br>请考虑如果在一个C源码文件中 #include 两个档 a.h 和 b.h, 而 a.h 又 #include 了 b.h 档(原因是 b.h 档定义了一些 a.h 需要的类型),会发生什么事呢?这时该 C源码文件 #include 了 b.h 两次。因此每一个在 b.h 中的 #define 都发生了两 次,每一 个声明发生了两次,等等。理论上,因为它们是完全一样的拷贝, 所以应该 不会有什么问题,但在实际应用上,这是不符合C的语法 的,可能在编译时出现错误,或至少是警告。 解决的方法是要确定每一个 header 档在任一个源码文件中只被包 含了一次。我们一 般是用预处理器来达到这个目的的。当我们进入 每一个 header 档时,我们为这个 header 档 #define 一个巨集 指令。只有在这个巨集指令没有被定义的前提下,我们 才真正使用 该 header 档的主体。在实际应用上,我们只要简单的把下面一段 码放在 每一个 header 档的开始部分: <br>#ifndef FILENAME_H <br>#define FILENAME_H <br>然后把下面一行码放在最后: <br>#endif <br>用 header 档的档名(大写的)代替上面的 FILENAME_H,用底线 代替档名中的点。有些人喜欢在 #endif 加上注释来提醒他们这个 #endif 指的是什么。例如: <br>#endif /* #ifndef FILENAME_H */ <br>我个人没有这个习惯,因为这其实是很明显的。当然这只是各人的 风格不同,无伤大雅。 <br>你只需要在那些有编译错误的 header 档中加入这个技巧,但在所 有的 header 档中都加入也没什么损失,到底这是个好习惯。<br> <br> <br></p> <p align="right"><a href="javascript:history.go(-1)" class="textinfo">返回 </a></p> </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> <!-- Start Fooder --><p align="center" class="9p">建议您使用<font face="Verdana, Arial, Helvetica, sans-serif">IE</font>浏览器<font color="#FF0000" face="Verdana, Tahoma, Times New Roman, 宋体, MS Sans Serif">800×600</font>以上分辩率浏览以获最佳效果<br><br><font face="Verdana, Arial, Helvetica, sans-serif">20CN</font>网络安全小组版权所有<br><font face="Verdana, Tahoma, Times New Roman, 宋体, MS Sans Serif">Copyright ©2000-2003 20CN Network Security Group. All Rights Reserved.</font><br>如有任何问题及建议请写信至<a href="mailto:webmaster@20cn.net"><font color="#000000" face="Verdana, Tahoma, Times New Roman, 宋体, MS Sans Serif">webmaster@20cn.net</font></a></p><p align="center" class="9p"><img src="http://www.20cn.net/images/powerd-4.4bsd.gif" border="0"></p><p align="center" class="9p"><script language="JavaScript">var urodz = new Date("DEC 31, 2000");var now = new Date();var ile = now.getTime() - urodz.getTime();var dni = Math.floor(ile / (1000 * 60 * 60 * 24)) + 1;if (dni > 0) document.write("建站第 " + dni + " 天")else document.write("建站第 " + dni + " 天");</script><br></p></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -