﻿<?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>C++博客-binghuo-随笔分类-c/c++</title><link>http://www.cppblog.com/binghuo/category/9760.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 10 Mar 2009 00:24:24 GMT</lastBuildDate><pubDate>Tue, 10 Mar 2009 00:24:24 GMT</pubDate><ttl>60</ttl><item><title>如何将多个C语言模块组合成一个程序</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76063.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Mon, 09 Mar 2009 23:43:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76063.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76063.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76063.html</trackback:ping><description><![CDATA[<h3><a style="TEXT-ALIGN: center">如何将多个C语言模块组合成一个程序 </a></h3>
<div class=content>如何将多个C语言模块组合成一个程序
<p>一般来说，我们编制的C语言源程序都是放在一个扩展名为.C的文件中，这对一个较简单的程序是合适的，但对于大型项目就不合适了，其一，大项目往往由多人合作完成，大家都来 <br>操作同一个文件极易出错；其二，大文件的编译、调试都极为复杂；其三，如果两个程序中都要用到同一个自定义的函数，此函数须从一文件移动到另一文件中，这种移动容易出错。为了解决这一矛盾，一个大的程序往往被分成几个部分，存放在不同的DOS文件各。各个部分可以分开编辑、编译，最后再把这几部分链接成一个完整的程序。 <br>　　把一程序分成几部分是有一定规则的。一个函数就不能分开在两个文件中，也不能在两个文件中都对其定义一次，因此每个文件都是由完整的对函数式变量的定义式说明组成的。对于某一文件中的函数，它可以直接引用本文件中所定义的函数和外部变量。如果要想引用别的文件中定义的函数或变量，则应在引用之前用extern，对此变量或函数进行说明。如果一个函数或外部变量在定义时前面加有static说明，那么就只有本文件内的函数能够使用它。习惯上，在每个文件的最前面放上不在此文件中的函数及变量的说明，由于对函数和变量的说明可以多次重复进行，往往建立一个头文件，在其中放入所有外部变量和外部函数的说明并在每个说明前面加上extern，然后每个源文件的第一行都用include包含这个头文件。 <br>　　对于每一个完整的源文件，都应该能够单独通过编译，以便迅速改正其中的编辑错误。 <br>Turbo c中，如果你选择了编译命令，它就编译当前编辑窗口中的文件。对于被调用函数，可以编出简单的调用函数对其可靠性进行测试，看它能不能完成预期的功能。 <br>　　在每一个文件都编好并且都通过了编译之后，你需要建立一个项目文件，把所有的文件组合在一起进行链接。如果你使用的是Borland c++ 2.0以上的版本或MS C的高版本的话，可以看到其主菜单上有一个Project(项目)菜单，其中一项为建立Project文件，选此命令，输入项目文件名后即可直接从列出的目录中选定组成项目的文件。但在Turbo C 2.0中，这个过程要复杂一些，下面我们来看一个例子。 <br>　　假设有一个程序，其中包含有main(),fun1(),fun2()三个函数及一个公用的外部变量 <br>int a:我们把main()及a的定义放在文件F1.C中，而将fun1(),及fun2()的定义放在文件F2.C中， <br>即 <br>F1.C <br>extern void fun1(int x); <br>extern void fun2(char c); <br>int a; <br>main() <br>{ fun1(5); <br>} fun2('A') <br>F2.C </p>
<p>extern int a; </p>
<p>void fun1(int x); </p>
<p>{&#8230; </p>
<p>a=a+x </p>
<p>&#8230; </p>
<p>} </p>
<p>void fun2(char c) </p>
<p>{&#8230; </p>
<p>} <br>　　先应把F1.C和F2.C分别输入计算机并编译后存盘。然后选File菜单下NEW命令，建立一个新的文件，即项目文件，不妨取名为MY.PRJ,其中只有两行： <br>F1.C <br>F2.C <br>必要时，还应在文件名前加上盘符和路径，存盘。然后打开Project菜单，选Project name.输入名字MY.PRT。这时Turbo.C就知道当前要链接，运行的是一个由两个文件组的程序。选择RUN菜单下的RUN命令即可对两个文件进行编译、链接和运行的一体化操作。F4，F7，F8及断点设置等功能也可用于程序的调试中。 </p>
</div>
<img src ="http://www.cppblog.com/binghuo/aggbug/76063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 07:43 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言中使用extern修饰函数要注意(转)</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76062.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Mon, 09 Mar 2009 23:42:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76062.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76062.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76062.html</trackback:ping><description><![CDATA[<a style="TEXT-ALIGN: center">[编程开发]C语言中使用extern修饰函数要注意(转)</a>
<div class=content>
<p>用extern修饰函数是表示被修饰的函数定义在当前文件外，而该函数用extern声明类型后就可以被当前文件调用了。使用extern修饰某函数时，对该函数的调用是在连接阶段才被处理的。下面我们看一段代码。</p>
<p>/***********************************************<br>&nbsp;* fun.c<br>&nbsp;***********************************************/</p>
<p>#include &lt;stdio.h&gt;</p>
<p>void fun (int n)<br>{<br>&nbsp;printf("%d\n");<br>}</p>
<p><br>/***********************************************<br>&nbsp;* test.c<br>&nbsp;***********************************************/</p>
<p>extern void fun (void);</p>
<p>int main ()<br>{<br>&nbsp;fun();<br>&nbsp;return 0;<br>}</p>
<p>着两个文件能编译连接到一起吗？答案是肯定的，而且不会出现警告。那我们运行这个程序看看什么结果：</p>
<p>C:\&gt; test.exe<br>2367460</p>
<p>这个数从哪来的？不知道。这是因为我们调用了一个需要参数的函数而没有传递参数给它，而这个函数还傻乎乎的以为传过了参数，从寄存器里读出它的参数就去干活了。那个寄存器里是什么值？谁也说不准。如果fun函数的参数是作为指针使用&#8230;&#8230;，啊！麻烦大了！</p>
<p>要解决问题，对于上面的小程序，我们直接冲过去改掉就成了。但是如果你的程序里有1000个文件，平均每个文件5000行（真正大的项目要比这大的多），那你还能一行行检查下去吗？如果调试过程中出了问题而你还不知道是这个原因导致的，如果你的程序很少运行到这个地方，&#8230;&#8230;</p>
<p>所以，正确的方法是防患于未然，写代码是养成良好的习惯。</p>
<p>对于使用gcc的朋友，建议总是使用&#8220;-Wall&#8221;，&#8220;-Wall&#8221;是一个细心的秘书，他会及时提醒你代码中存在的风险。</p>
<p>尽量避免使用extern修饰函数。一般情况下，如果我们希望某个函数可以被外界使用，就创建一个头文件，在其中声明该函数的类型。哪个程序需要调用这个函数就把它的头文件包含进去。这样一来如果调用的地方使用不当，在编译阶段就会提示错误，也节省了时间。而且，定义函数和声明函数是同一个人做的，出错的机会也就小了。</p>
</div>
<img src ="http://www.cppblog.com/binghuo/aggbug/76062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 07:42 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>