C++语言常见问题解答(4)

2008-02-23 05:34:53来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

== Part 4/4  ============================ 
======================================= 
■□ 第17节:和 C 连结/和 C 的关系 
======================================= 
 
Q105:怎样从 C  中呼叫 C 的函数 "f(int,char,float)"? 
 
告诉 C  编译器说:他是个 C 的函数: 
         extern "C" void f(int,char,float); 
 
确定您有 include 进来完整的函数原型 (function prototype)。一堆 C 的函数可 
以用大括号框起来,如下: 
 
         extern "C" { 
           void* malloc(size_t); 
           char* strcpy(char* dest, const char* src); 
           int   printf(const char* fmt, ...); 
         } 
 
======================================== 
 
Q106:怎样才能建一个 C  函数 "f(int,char,float)",又能被 C 呼叫? 
 
想让 C  编译器知道 "f(int,char,float)" 会被 C 编译器用到的话,就要用到前 
一则 FAQ 已详述的 "extern C" 语法。接著在 C  模组内定义该函数: 
 
         void f(int x, char y, float z) 
         { 
           //... 
         } 
 
"extern C" 一行会告诉编译器:送到 linker 的外部资讯要采用 C 的呼叫惯例及签 
名编码法(譬如,前置一个底线)。既然 C 没有多载名称的能力,您就不能让 C 程 
式能同时呼叫得到多载的函数群。 
 
警告连同实作相关事项: 
  * 您的 "main()" 应该用 C  编译之(为了静态物件的初始化)。 
  * 您的 C  编译器应该能设定连结的程式(为某些特别的程式库)。 
  * 您的 C 和 C  编译器可能要是同一个牌子的,而且是相容的版本(亦即:有相 
    同的呼叫惯例等等)。 
 
======================================== 
 
Q107:为什麽 linker 有这种错误讯息:C/C  函数被 C/C  函数呼叫到? 
 
看前两则 FAQs 关於 extern "C" 的使用。 
 
======================================== 
 
Q108:该怎麽把 C  类别的物件传给/传自 C 的函数? 
 
例子: 
 
         /****** C/C  header file: Fred.h ******/ 
         #ifdef __cplusplus    /*"__cplusplus" is #defined if/only-if 
                                  compiler is C */ 
           extern "C" { 
         #endif 
 
         #ifdef __STDC__ 
           extern void c_fn(struct Fred*);       /* ANSI-C prototypes */ 
           extern struct Fred* cplusplus_callback_fn(struct Fred*); 
         #else 
           extern void c_fn();                   /* K&R style */ 
           extern struct Fred* cplusplus_callback_fn(); 
         #endif 
 
         #ifdef __cplusplus 
           } 
         #endif 
 
         #ifdef __cplusplus 
           class Fred { 
           public: 
             Fred(); 
             void wilma(int); 
           private: 
             int a_; 
           }; 
         #endif 
 
"Fred.C" 是个 C  模组: 
 
         #include "Fred.h" 
         Fred::Fred() : a_(0) { } 
         void Fred::wilma(int a) : a_(a) { } 
 
         Fred* cplusplus_callback_fn(Fred* fred) 
         { 
           fred->wilma(123); 
           return fred; 
         } 
 
"main.C" 是个 C  模组: 
 
         #include "Fred.h" 
 
         int main() 
         { 
           Fred fred; 
           c_fn(&fred); 
           return 0; 
         } 
 
"c-fn.c" 是个 C 模组: 
 
         #include "Fred.h" 
         void c_fn(struct Fred* fred) 
         { 
           cplusplus_callback_fn(fred); 
         } 
 
把指向 C  物件的指标传到/传自 C 的函数,假如传出和收回的指标不是“完全相 
同”的话,就会失败。譬如,不要传出一个基底类别的指标却收回一个衍生类别的指 
标,因为 C 编译器不懂该怎麽对多重及虚拟继承的指标做转型。 
 
======================================== 
 
Q109:C 的函数能不能存取 C  类别的物件资料? 
 
有时能够。 
 
(请先读一读前一则关於和 C 函数间传递 C  物件的 FAQ。) 
 
您能够安全地从 C 函数中存取 C  物件的资料,只要 C  的物件类别: 
  * 没有虚拟函数(包含继承下来的虚拟函数). 
  * 任何资料都在同一个存取等级中 (private/protected/public). 
  * 完全被包含的子物件中也都没有虚拟函数. 
 
假如 C  类别有任何基底类别(或是任何被完全包含的子物件中有基底类别)的话 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C++语言常见问题解答(3)

下一篇: 函数调用的传值和“传址”