﻿<?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++博客-new-world-文章分类-c编程基础</title><link>http://www.cppblog.com/new-world/category/16305.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 21 Mar 2011 04:59:03 GMT</lastBuildDate><pubDate>Mon, 21 Mar 2011 04:59:03 GMT</pubDate><ttl>60</ttl><item><title>”Undefined reference to“ 的处理</title><link>http://www.cppblog.com/new-world/articles/142120.html</link><dc:creator>易简</dc:creator><author>易简</author><pubDate>Fri, 18 Mar 2011 04:18:00 GMT</pubDate><guid>http://www.cppblog.com/new-world/articles/142120.html</guid><wfw:comment>http://www.cppblog.com/new-world/comments/142120.html</wfw:comment><comments>http://www.cppblog.com/new-world/articles/142120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/new-world/comments/commentRss/142120.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/new-world/services/trackbacks/142120.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 12px; LINE-HEIGHT: 21px; FONT-FAMILY: Arial, Helvetica, sans-serif, 宋体; TEXT-ALIGN: left">在C++代码中调用C的库文件，需加上extern "C"，用来告知编译器：这是一个用C写成的库文件，请用C的方式连接他们。<br style="WORD-BREAK: break-all; LINE-HEIGHT: normal">Undefined reference to 错误:这类错误是在连接过程中出现的，可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件，没有被编译、连接，或者干脆还没有定义，这需要使用者根据实际情况修改源程序，给出全局变量或者函数的定义体；二是未定义的符号是一个标准的库函数，在源程序中使用了该库函数，而连接过程中还没有给定相应的函数库的名称，或者是该档案库的目录名称有问题.</span></span>
<img src ="http://www.cppblog.com/new-world/aggbug/142120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/new-world/" target="_blank">易简</a> 2011-03-18 12:18 <a href="http://www.cppblog.com/new-world/articles/142120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用预声明解决结构体互相引用以及头文件内容互相包含的问题</title><link>http://www.cppblog.com/new-world/articles/142119.html</link><dc:creator>易简</dc:creator><author>易简</author><pubDate>Fri, 18 Mar 2011 04:14:00 GMT</pubDate><guid>http://www.cppblog.com/new-world/articles/142119.html</guid><wfw:comment>http://www.cppblog.com/new-world/comments/142119.html</wfw:comment><comments>http://www.cppblog.com/new-world/articles/142119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/new-world/comments/commentRss/142119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/new-world/services/trackbacks/142119.html</trackback:ping><description><![CDATA[<p>使用预声明解决结构体互相引用以及头文件内容互相包含的问题</p>
<p>技术文档 2010-01-08 10:21:06 阅读178 评论0&nbsp;&nbsp; 字号：大中小 订阅<br>首先声明，简单的头文件重复包含问题不在此文的讨论范围之内，此问题可以通过下面的文件格式进行解决。<br>#ifndef __filename_h__<br>#define __filename_h__</p>
<p>/* code */</p>
<p>#endif </p>
<p><br>我们这里讨论的头文件互相包含是文件中的内容有互相引用的情况。比如test_a.h文件中定义了结构体TEST_A_S，test_b.h文件中定义了结构体TEST_B_S，且TEST_A_S引用了TEST_B_S，同时TEST_B_S也引用了TEST_A_S。</p>
<p>此问题的本质就是结构体的互相引用，下面我们对结构体互相引用的问题进行分析，而对于头文件互相包含的问题不再特别指出。</p>
<p>通常情况下，我们写作结构体的时候都是声明和定义一起做的，不会单独对要定义的结构体进行声明。对于要引用的结构体，我们把它放在定义的结构体前面即可。</p>
<p>但有这样一种情况：两个结构体互相引用，也就是两个结构体互相成为对方的成员变量。此时，我们应该如何来组织我们的数据结构呢？</p>
<p>这时，我们可以使用声明实现两个结构体的互相引用，即先在前面对其中的某个结构体进行声明。声明之后，我们就可以互相引用了。</p>
<p><br>样例1（正确样例）：</p>
<p>typedef struct tagTest_B TEST_B_S;</p>
<p>typedef struct tagTest_A<br>{<br>&nbsp;&nbsp;&nbsp; TEST_B_S *pstB;<br>} TEST_A_S;</p>
<p>struct tagTest_B<br>{<br>&nbsp;&nbsp;&nbsp; TEST_A_S *pstA;<br>};</p>
<p>&nbsp;</p>
<p><br>看完上面这个样例，大家再来看看下面这个例子，看一下有没有什么问题？</p>
<p><br>样例2（错误样例）：</p>
<p>typedef struct tagTest_B TEST_B_S;</p>
<p>typedef struct tagTest_A<br>{<br>&nbsp;&nbsp;&nbsp; TEST_B_S stB;<br>} TEST_A_S;</p>
<p>struct tagTest_B<br>{<br>&nbsp;&nbsp;&nbsp; TEST_A_S *pstA;<br>};</p>
<p>如果我们使用VC进行编译（当然你也可以使用GCC编译），VC编译的时候会报错，如下：<br>error C2079: 'stB' uses undefined struct 'tagTest_B'<br>这是什么原因呢？</p>
<p>这是因为声明的时候只是简单的表明是某种结构体而已，而结构体的内容我们不得而知。<br>因此我们引用的时候只能使用指针而不能直接使用结构体，因为只有这样才能为结构体分配确定的内存<br>(指针的内存始终是4字节，而未知结构体的内存大小是不确定的)。</p>
<p><br>另外，顺便看一下下面这种写法。</p>
<p>样例3（pclint会有Info提示）：<br>typedef struct tagTest_B TEST_B_S;</p>
<p>typedef struct tagTest_A<br>{<br>&nbsp;&nbsp;&nbsp; TEST_B_S *pstB;<br>} TEST_A_S;</p>
<p>typedef struct tagTest_B<br>{<br>&nbsp;&nbsp;&nbsp; TEST_A_S *pstA;<br>} TEST_B_S;</p>
<p>上面这样写，使用Lintware软件做pclint时，会提示说TEST_B_S重复定义（Info等级），这是因为两次使用typedef定义了TEST_B_S。Lintware要求比较严格，实际上就这样写也是可以通过VC编译并且正常运行的，不用太在意。</p>
<img src ="http://www.cppblog.com/new-world/aggbug/142119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/new-world/" target="_blank">易简</a> 2011-03-18 12:14 <a href="http://www.cppblog.com/new-world/articles/142119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>