#if defined(__cplusplus)

由于C++編譯器需要支持函數的重載,會改變函數的名稱,因此dll的導出函數通常是標準C定義的。這就使得C和C++的互相調用變得很常見。但是有時可能又會直接用C來調用,不想重新寫代碼,讓標準C編寫的dll函數定義在C和C++編譯器下都能編譯通過,通常會使用以下的格式:(這個格式在很多成熟的代碼中很常見)
#if defined(__cplusplus)//只有c++編譯器才有這個宏定義。
extern "C" {
#endif
// 在這里寫標準C程序,例如dll導出函數的定義
#ifdef __cplusplus
?????}
#endif

下面解釋一下上面的代碼:
??????首先__cplusplus是C++編譯器內部定義的宏,如果使用的C編譯器,__cplusplus宏不會被定義。它可以作為區分使用的是C編譯器還是C++編譯器的標志。在標準C中C代碼直接寫就可以了。而在C++中,需要加extern "C"或包含在extern "C"塊中。

由于標準C是不支持extern "C"的,會產生變異錯誤,所以使用預編譯指令通過__cplusplus來判斷只有在使用C++編譯器的時候才定義extern "C"。

意思是說,如果是C++程序,就使用
extern "C"{
而這個東東,是指在下面的函數不使用的C++的名字修飾,而是用C的

extern "c" 函數描述?指定它為C函數

extern "C"表示編譯生成的內部符號名使用C約定

?C++支持函數重載,而C不支持,兩者的編譯規則也不一樣。函數被C++編譯后在符號庫中的名字與C語言的不同。例如,假設某個函數的原型為: void foo( int x, int y ); 該函數被C編譯器編譯后在符號庫中的名字可能為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不 同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。下面以例子說明,如何 在C++中使用C的函數,

?

http://www.cnblogs.com/HappyXie/archive/2011/01/07/1929369.html

轉載于:https://www.cnblogs.com/azbane/p/8522625.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281095.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

happiness[國家集訓隊2011(吳確)]

【試題來源】 2011中國國家集訓隊命題答辯【問題描述】 高一一班的座位表是個n*m的矩陣,經過一個學期的相處,每個同學和前后左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對于選擇文科與理科有著自己的喜悅值,而一…

sketch怎么移動圖層_什么是Photoshop Express,Fix,Mix和Sketch移動應用程序?

sketch怎么移動圖層Adobe’s approach to mobile apps seems to be “The More, The Better”. Right now, there are five Photoshop branded apps available for iOS and Android. Adobe的移動應用程序方法似乎是“越多越好”。 目前,有五個適用于iOS和Android的P…

imessage_如何在iPhone和iPad上的iMessage組中提及某人

imessageKhamosh PathakKhamosh PathakSometimes, it’s difficult to get someone’s attention in a large iMessage group chat on your iPhone or iPad. However, if you mention that person specifically in a message, your friend will receive a notification about i…

點擊右側導航欄,實現iframe嵌入子頁面中div,滑動到最上面

2019獨角獸企業重金招聘Python工程師標準>>> // 點擊對應的nav里的li標簽,頁面就滾動到哪里 $(.title-list > li).click(function(event) {$(this).addClass(active).siblings().removeClass(active);//li標簽里面有a標簽,可以阻止到a標簽的默認行為event.preven…

wepack環境配置1之node的安裝

.向往已久的webpack終于配好了.. 1.要安裝webpack,首先需要安裝nodejs nodejs下載地址:https://nodejs.org/en/ 下載完成后,一步步安裝即可,我是安裝到D盤 新建一個nodejs的文件夾,裝到這個文件夾里面即可. 安裝完畢后檢查自己是否安裝成功.啟動cmd,然后輸入npm -v,…

【賞析】.NET跨平臺框架-Avalonia UI

這是Avalonia UI官方的一個Demo,站長對部分Nuget包進行了升級,網友【小飛機MLA】對Linux版本修復了字體Bug得以正常運行、演示:Windows 11:macOS 13:可安裝Rider(EAP即要)開發,站長一…

Kernel Newbies內核開發新手的資源

Jessica McKellar在Ksplice blog上的博客文章《Linux Device Drivers》如果你在寫一個操作系統,OSDev wiki是一個不錯的網站Kernel Newbies內核開發新手的資源

office自定義安裝選項_如何自定義Office 2013中功能區上的現有選項卡

office自定義安裝選項The Ribbon in Microsoft Office 2013 provides quick access to many features and options by default, but it can be further customized to fit the way you use it. You can add a custom tab to the ribbon or you can add commands to the existin…

Centos6.8 安裝spark-2.3.1 以及 scala-2.12.2

一、Spark概述 Spark 是一個用來實現快速而通用的集群計算的平臺。 在速度方面,Spark 擴展了廣泛使用的 MapReduce 計算模型,而且高效地支持更多計算模式,包括交互式查詢和流處理。 在處理大規模數據集時,速度是非常重要的。速…

聊一聊 WPF 程序的鍵盤是如何被竊聽的?

一:背景 1.講故事前幾天群里很熱鬧,看了下在爭論兩個問題:電腦里要不要裝殺毒軟件 ?應該裝什么殺毒軟件 ?不管殺毒軟件流氓不流氓,在如今病毒肆虐的當下互聯網,裝一個還是能幫我們攔截很多意想不到的東西&#xff0c…

httpclient 實現文件上傳中轉

開發功能: web前端提交上傳文件 —> a服務器接收 —> 轉發到b服務器進行文件處理 下面是簡單實現的代碼,具體細節優化根本自己的需求更改。 public String handleResponse(HttpServletRequest request, HttpServletResponse response)throws Unsup…

AngularJS $watch 性能殺手

雙向綁定是AngularJS核心概念之一,它給我們帶來了思維的轉變,不再是以DOM為驅動,而是以Model為核心,View中寫上聲明式標簽(指令或{{}}),AngularJS會在后臺默默同步View到Model,并將Model的變化更新到View。…

ipad和iphone切圖_如何在iPhone和iPad上的Messages App中固定對話

ipad和iphone切圖Khamosh PathakKhamosh PathakBetween updates from your bank and group chats, the Messages app on your iPhone or iPad can be a mess. Use the pinned conversations feature introduced in iOS 14 and iPadOS 14 to access your favorite conversations…

這個WPF的企業級MES項目爆火,就是UI爭議大!

工業4.0時代,智能智造MES系統大行其道,然而基于.NET跨平臺的罕見!這里有一套《.NET6WPF企業級MES實戰》教程,基于.NET6跨平臺開發,實現了MES多核心功能,尤其是開發框架完整,非常適合復用。這里分…

單調棧學習筆記

線性結構——單調棧①定義:棧內的元素,按照某種方式排序(單調遞增或單調遞減)如果新入棧的元素破壞了單調性,就彈出棧內元素,直到滿足單調性②優點:可以很方便地求出某個數左邊或者右邊第一個比…

《VMware Virtual SAN權威指南(原書第2版)》一1.5 什么是Virtual SAN

1.5 什么是Virtual SAN Virtual SAN是VMware推出的一種存儲解決方案,它的beta版本在2013年發布,2014年3月正式開放給公眾,并于2016年3月升級到6.2版。VSAN完全集成在vSphere中,它是一種基于對象的存儲系統,是虛擬機存…

js 控制超出字數顯示省略號

//多余顯示省略號 function wordlimit(cname, wordlength) {var cname document.getElementsByClassName(cname);for (var i 0; i < cname.length; i) {      var nowLength cname[i].innerHTML.length;if (nowLength > wordlength) {cname[i].innerHTML cname…

在Outlook 2007中查看您的Google日歷

Google Calendar is a phenomenal web application for managing your calendars, but so many of us are still forced to use Outlook at work. The good thing is you can have the best of both worlds by subscribing to your Google Calendar from Outlook. Google日歷是…

元宇宙、數字孿生和企業NFT

昨天參加了華為云上海開發者日活動&#xff0c;并客串主持了一場"元宇宙技術創新和商業實踐之路"的閉門研討會。研討會上大家討論熱烈&#xff0c;干貨多多&#xff0c;大家提到元宇宙的企業級前景、數字藏品和數字人案例的親身體會。在會上盆盆分享了自己關于企業級…

設置狀態欄和標題欄的樣式

設置狀態欄和標題欄的樣式Android setSystemUiVisibility(visible)方法詳解這個方法可以詳細的設置各種標題欄的狀態欄的樣式.visible的值來決定1.SYSTEM_ UI_ FLAG_ LOW_ PROFILE: 影藏不重要的狀態欄圖標&#xff0c;導航欄中相應的圖標都變成了一個小點。點擊狀態欄或者標題…