溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在C語言中引用C++的函數和變量

發布時間:2021-08-19 18:07:02 來源:億速云 閱讀:236 作者:chen 欄目:編程語言

本篇內容主要講解“怎么在C語言中引用C++的函數和變量”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么在C語言中引用C++的函數和變量”吧!

引用C++語言的頭文件需添加extern "C",但是在C語言中不能直接引用聲明了extern "C"的該頭文件,應該僅將C文件中將C++中定義的extern "C"函數聲明為extern類型,希望本文能教會你更多東西。

實際上,在連接階段,連接器會從模塊A生成的目標文件moduleA.obj中尋找_foo_int_int這樣的符號!加extern "C"聲明后的編譯和連接方式加extern "C"聲明后,模塊A的頭文件變為:

// 模塊A頭文件 moduleA.h  #ifndef MODULE_A_H  #define MODULE_A_H  extern "C" int foo( int x, int y );  #endif

在模塊B的實現文件中仍然調用foo( 2,3 ),其結果是:
(1)模塊A編譯生成foo的目標代碼時,沒有對其名字進行特殊處理,引用C++語言的方式;
(2)連接器在為模塊B的目標代碼尋找foo(2,3)調用時,尋找的是未經修改的符號名_foo。如果在模塊A中函數聲明了foo為extern "C"類型,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數;反之亦然。

所以,可以用一句話概括extern “C”這個聲明的真實目的(任何語言中的任何語法特性的誕生都不是隨意而為的,來源于真實世界的需求驅動。我們在思考問題時,不能只停留在這個語言是怎么做的,還要問一問它為什么要這么做,動機是什么,這樣我們可以更深入地理解許多問題):

  • 探索C++語言種種簡潔靈活特性說明

  • 如何使用Visual C++子集搜索主題

  • 如何更好學習C++ ——及C++學習方法總結

  • 高級編程對C++學習方法說明指導

  • 更好的理解C++編程學習與研究

實現C++與C及其它語言的混合編程。明白了C++中extern "C"的設立動機,我們下面來具體分析extern "C"通常的使用技巧。
.extern "C"的慣用法
(1)在C++中引用C語言中的函數和變量,在包含C語言頭文件(假設為cExample.h)時,需進行下列處理:

extern "C"  {  #include "cExample.h"  }

而在C語言的頭文件中,對其外部函數只能指定為extern類型,引用C++語言中不支持extern "C"聲明,在.c文件中包含了extern "C"時會出現編譯語法錯誤。筆者編寫的C++引用C函數例子工程中包含的三個文件的源代碼如下:

/* c語言頭文件:cExample.h */  #ifndef C_EXAMPLE_H  #define C_EXAMPLE_H  extern int add(int x,int y);  #endif  /* c語言實現文件:cExample.c */  #include "cExample.h"  int add( int x, int y )  {   return x + y;  }  // c++實現文件,調用add:cppFile.cpp  extern "C"   {   #include "cExample.h"  }  int main(int argc, char* argv[])  {   add(2,3);    return 0;  }

如果C++調用一個C語言編寫的.DLL時,當包括.DLL的頭文件或聲明接口函數時,應加extern "C" { }。(2)在C中引用C++語言中的函數和變量時,C++的頭文件需添加extern "C",但是在C語言中不能直接引用聲明了extern "C"的該頭文件,應該僅將C文件中將C++中定義的extern "C"函數聲明為extern類型。

到此,相信大家對“怎么在C語言中引用C++的函數和變量”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女