国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++語言常見問題解答(4)

2019-11-17 05:44:03
字體:
來源:轉載
供稿:網友

== 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。)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广元市| 五寨县| 南溪县| 永丰县| 江津市| 台南市| 鲁甸县| 大港区| 绥芬河市| 海阳市| 定结县| 万全县| 杨浦区| 华池县| 徐水县| 中超| 元江| 建宁县| 静安区| 安吉县| 大埔县| 香河县| 溧水县| 涟水县| 滨海县| 桓台县| 西乌| 松阳县| 德化县| 柘城县| 德格县| 盘锦市| 隆林| 蓬安县| 横山县| 罗定市| 临泽县| 蛟河市| 孟州市| 柘城县| 沂南县|