⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>&nbsp;<BR>==&nbsp;Part&nbsp;4/4&nbsp;&nbsp;============================&nbsp;<BR>&nbsp;<BR>comp.lang.c++&nbsp;Frequently&nbsp;Asked&nbsp;Questions&nbsp;list&nbsp;(with&nbsp;answers,&nbsp;fortunately).&nbsp;<BR>Copyright&nbsp;(C)&nbsp;1991-96&nbsp;Marshall&nbsp;P.&nbsp;Cline,&nbsp;Ph.D.&nbsp;<BR>Posting&nbsp;4&nbsp;of&nbsp;4.&nbsp;<BR>Posting&nbsp;#1&nbsp;explains&nbsp;copying&nbsp;permissions,&nbsp;(no)warranty,&nbsp;table-of-contents,&nbsp;etc&nbsp;<BR>&nbsp;<BR>=======================================&nbsp;<BR>■□&nbsp;第17节:和&nbsp;C&nbsp;连结/和&nbsp;C&nbsp;的关系&nbsp;<BR>=======================================&nbsp;<BR>&nbsp;<BR>Q105:怎样从&nbsp;C++&nbsp;中呼叫&nbsp;C&nbsp;的函数&nbsp;&quot;f(int,char,float)&quot;?&nbsp;<BR>&nbsp;<BR>告诉&nbsp;C++&nbsp;编译器说:它是个&nbsp;C&nbsp;的函数:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;&quot;C&quot;&nbsp;void&nbsp;f(int,char,float);&nbsp;<BR>&nbsp;<BR>确定你有&nbsp;include&nbsp;进来完整的函数原型&nbsp;(function&nbsp;prototype)。一堆&nbsp;C&nbsp;的函数可&nbsp;<BR>以用大括号框起来,如下:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;&quot;C&quot;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void*&nbsp;malloc(size_t);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char*&nbsp;strcpy(char*&nbsp;dest,&nbsp;const&nbsp;char*&nbsp;src);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;printf(const&nbsp;char*&nbsp;fmt,&nbsp;...);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q106:怎样才能建一个&nbsp;C++&nbsp;函数&nbsp;&quot;f(int,char,float)&quot;,又能被&nbsp;C&nbsp;呼叫?&nbsp;<BR>&nbsp;<BR>想让&nbsp;C++&nbsp;编译器知道&nbsp;&quot;f(int,char,float)&quot;&nbsp;会被&nbsp;C&nbsp;编译器用到的话,就要用到前&nbsp;<BR>一则&nbsp;FAQ&nbsp;已详述的&nbsp;&quot;extern&nbsp;C&quot;&nbsp;语法。接著在&nbsp;C++&nbsp;模组内定义该函数:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;f(int&nbsp;x,&nbsp;char&nbsp;y,&nbsp;float&nbsp;z)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//...&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&quot;extern&nbsp;C&quot;&nbsp;一行会告诉编译器:送到&nbsp;linker&nbsp;的外部资讯要采用&nbsp;C&nbsp;的呼叫惯例及签&nbsp;<BR>名编码法(譬如,前置一个底线)。既然&nbsp;C&nbsp;没有多载名称的能力,你就不能让&nbsp;C&nbsp;程&nbsp;<BR>式能同时呼叫得到多载的函数群。&nbsp;<BR>&nbsp;<BR>警告以及实作相关事项:&nbsp;<BR>&nbsp;*&nbsp;你的&nbsp;&quot;main()&quot;&nbsp;应该用&nbsp;C++&nbsp;编译之(为了静态物件的初始化)。&nbsp;<BR>&nbsp;*&nbsp;你的&nbsp;C++&nbsp;编译器应该能设定连结的程序(为某些特殊的程式库)。&nbsp;<BR>&nbsp;*&nbsp;你的&nbsp;C&nbsp;和&nbsp;C++&nbsp;编译器可能要是同一个牌子的,而且是相容的版本(亦即:有相&nbsp;<BR>&nbsp;&nbsp;&nbsp;同的呼叫惯例等等)。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q107:为什麽&nbsp;linker&nbsp;有这种错误讯息:C/C++&nbsp;函数被&nbsp;C/C++&nbsp;函数呼叫到?&nbsp;<BR>&nbsp;<BR>看前两则&nbsp;FAQs&nbsp;关於&nbsp;extern&nbsp;&quot;C&quot;&nbsp;的使用。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q108:该怎麽把&nbsp;C++&nbsp;类别的物件传给/传自&nbsp;C&nbsp;的函数?&nbsp;<BR>&nbsp;<BR>例子:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/******&nbsp;C/C++&nbsp;header&nbsp;file:&nbsp;Fred.h&nbsp;******/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;__cplusplus&nbsp;&nbsp;&nbsp;&nbsp;/*&quot;__cplusplus&quot;&nbsp;is&nbsp;#defined&nbsp;if/only-if&nbsp;<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;&nbsp;&nbsp;&nbsp;compiler&nbsp;is&nbsp;C++*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;&quot;C&quot;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;__STDC__&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;c_fn(struct&nbsp;Fred*);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;ANSI-C&nbsp;prototypes&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;struct&nbsp;Fred*&nbsp;cplusplus_callback_fn(struct&nbsp;Fred*);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;c_fn();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;K&amp;R&nbsp;style&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;struct&nbsp;Fred*&nbsp;cplusplus_callback_fn();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;__cplusplus&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;__cplusplus&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Fred&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;wilma(int);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a_;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;<BR>&nbsp;<BR>&quot;Fred.C&quot;&nbsp;是个&nbsp;C++&nbsp;模组:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&quot;Fred.h&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred::Fred()&nbsp;:&nbsp;a_(0)&nbsp;{&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Fred::wilma(int&nbsp;a)&nbsp;:&nbsp;a_(a)&nbsp;{&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred*&nbsp;cplusplus_callback_fn(Fred*&nbsp;fred)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fred-&gt;wilma(123);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fred;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&quot;main.C&quot;&nbsp;是个&nbsp;C++&nbsp;模组:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&quot;Fred.h&quot;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred&nbsp;fred;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c_fn(&amp;fred);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&quot;c-fn.c&quot;&nbsp;是个&nbsp;C&nbsp;模组:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&quot;Fred.h&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;c_fn(struct&nbsp;Fred*&nbsp;fred)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cplusplus_callback_fn(fred);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>把指向&nbsp;C++&nbsp;物件的指标传到/传自&nbsp;C&nbsp;的函数,如果传出与收回的指标不是“完全相&nbsp;<BR>同”的话,就会失败。譬如,不要传出一个基底类别的指标却收回一个衍生类别的指&nbsp;<BR>标,因为&nbsp;C&nbsp;编译器不懂该怎麽对多重及虚拟继承的指标做转型。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q109:C&nbsp;的函数能不能存取&nbsp;C++&nbsp;类别的物件资料?&nbsp;<BR>&nbsp;<BR>有时可以。&nbsp;<BR>&nbsp;<BR>(请先读一读前一则关於和&nbsp;C&nbsp;函数间传递&nbsp;C++&nbsp;物件的&nbsp;FAQ。)&nbsp;<BR>&nbsp;<BR>你可以安全地从&nbsp;C&nbsp;函数中存取&nbsp;C++&nbsp;物件的资料,只要&nbsp;C++&nbsp;的物件类别:&nbsp;<BR>&nbsp;*&nbsp;没有虚拟函数(包含继承下来的虚拟函数).&nbsp;<BR>&nbsp;*&nbsp;所有资料都在同一个存取等级中&nbsp;(private/protected/public).&nbsp;<BR>&nbsp;*&nbsp;完全被包含的子物件中也都没有虚拟函数.&nbsp;<BR>&nbsp;<BR>如果&nbsp;C++&nbsp;类别有任何基底类别(或是任何被完全包含的子物件中有基底类别)的话&nbsp;<BR>,技术上来说,存取该资料没有可携性的,因为语言没规定在继承之下的类别配置是&nbsp;<BR>什麽样子。不过经验上,所有&nbsp;C++&nbsp;编译器的做法都一样:基底类别物件先出现(在&nbsp;<BR>多重继承之下,则由左到右排列之),子物件次之。&nbsp;<BR>&nbsp;<BR>还有,如果类别(或是任何基底类别)含有任何虚拟函数,你时常可以(但不是一直&nbsp;<BR>都可以)假设有一个&nbsp;&quot;void*&quot;&nbsp;出现在物件第一个虚拟函数之所在,或是在该物件的&nbsp;<BR>第一个&nbsp;word&nbsp;那里。同样的,语言对它也没规定到,但这似乎是「大家」都采取的做&nbsp;<BR>法。&nbsp;<BR>&nbsp;<BR>如果该类别有任何虚拟基底类别,情况会更复杂而且更没有可携性。常见的做法是:&nbsp;<BR>让物件最後才包含基底类别之物件&nbsp;(V)(不管&nbsp;&quot;V&quot;&nbsp;在继承阶层中在哪儿出现),物&nbsp;<BR>件的其他部份则以正常的次序出现。每个有&nbsp;V&nbsp;这个虚拟基底类别的衍生类别,实际&nbsp;<BR>上都有个“指标”指向最後一个物件的&nbsp;V&nbsp;的部份。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -