衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言與C++相互調用

strongerHuang ? 來源:strongerHuang ? 作者:嵌入式情報局 ? 2021-01-18 11:05 ? 次閱讀

1C與C++相互調用

在一個嵌入式系統中大部分的底層和驅動層更多的是采用C語言來進行開發,而上層應用、服務更多的采用C++等高級語言來進行面向對象等方面的開發方式,那么就存在一個上層調用底層接口的問題,比如最常用的C++調用C的接口來完成相應的外設驅動接口。

我們知道C++幾乎是完全兼容C的,不同的編譯語言都有其自身的一套編譯規則,當然C語言與C++的編譯規則是不同的,但C++編譯器為了兼容C語言相當于兼容了C語言編譯方式,而C語言編譯器一般就不會去兼容C++的編譯方式。

d2761992-58f7-11eb-8b86-12bb97331649.png

所以理論上來說用C編譯器編譯好的模塊能夠直接通過C++來進行調用才對。

2extern關鍵字

由于C++編譯器默認都是按照C++的編譯方式來對源文件進行編譯,這樣C語言文件也會直接采用C++編譯。

對于底層的驅動等都會以使用C語言編寫的DLL等給出來,然后從中導出函數給C或C++的模塊來進行訪問,所以還是需要C++語法中能夠標識出來給編譯器,哪些需要采用C++方式編譯,哪些需要采用C方式編譯。

那么這個編譯區分就由extern “C”來完成,下面我們就以一個例子看看如何使用的。

//FileName:main.c
#include
#include
#include"Cal.h"

intmain(intargc,char**argv){

printf("Cal(int):%d
",Cal(5));
printf("Cal(float):%.5f
",Cal(1.1f));
return0;
}
//FileName:Cal.c
#include"Cal.h"

intCal(intVal)
{
returnVal*Val;
}

floatCal(floatVal)
{
returnVal*Val;
}

//FileName:Cal.h
#ifndef__CAL_H__
#define__CAL_H__

//extern"C"
//{

intCal(intVal);
floatCal(floatVal);

//}
#endif

以上extern “C”注釋部分表示的就是Cal.c文件將會以C編譯方式進行,由于C++支持函數重載而C語言不支持函數重載,所以以上源碼可以直接編譯可以通過,而一旦把extern“C”注釋去掉,便會編譯失敗。

3互調操作

d299372e-58f7-11eb-8b86-12bb97331649.png

上面小哥畫了一張互調的簡圖,并分別解釋一下:

1)C++編譯器通過extern “C”即可直接調用以C方式編譯的庫文件,最終與其他文件一起編譯成為一個可執行文件。

2)C++編譯器首先將模塊用extern “C”方式編譯好,C編譯器直接拿了該模塊文件與其他文件一起編譯生成可執行文件。

4小技巧

在C++編譯器內部一般都會內置__cplusplus這樣一個宏定義,那么我們可以通過使用該宏來設置一個預編譯結構,當在C++編譯器下就使用extern “C”編譯C模塊代碼,否則就剔除,相信大家在一些庫文件中經常看到。

#ifdef__cplusplus
extern"C"
{
#endif

//fuctiondefinitionordeclaration

#ifdef__cplusplus
}
#endif

責任編輯:xj

原文標題:C代碼與C++互相調用的小技巧

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137732
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73859
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69058

原文標題:C代碼與C++互相調用的小技巧

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發表于 01-14 09:40 ?150次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    EE-128:C語言中的DSP:從C調用匯編類成員函數

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
    發表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的DSP:從<b class='flag-5'>C</b><b class='flag-5'>調用</b>匯編類成員函數

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發者打造鴻蒙原生應用過程中廣泛使用的跨語言調用解決方案。 AKI是一款專為鴻蒙原生開發設計的FFI(外部函數接口
    發表于 01-02 17:08

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++
    的頭像 發表于 11-29 10:25 ?434次閱讀

    C7000 C/C++優化指南用戶手冊

    電子發燒友網站提供《C7000 C/C++優化指南用戶手冊.pdf》資料免費下載
    發表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優化指南用戶手冊

    C語言C++中結構體的區別

    同樣是結構體,看看在C語言C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?357次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    C++有多態與繼承,但是很多人開始學習C++,有時候會面臨一個常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有instanceof這個
    的頭像 發表于 07-18 10:16 ?673次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    SEGGER編譯器優化和安全技術介紹 支持最新CC++語言

    SEGGER編譯器是專門為ARM和RISC-V微控制器設計的優化C/C++編譯器。它建立在強大的Clang前端上,支持最新的CC++語言
    的頭像 發表于 06-04 15:31 ?1528次閱讀
    SEGGER編譯器優化和安全技術介紹 支持最新<b class='flag-5'>C</b>和<b class='flag-5'>C++</b><b class='flag-5'>語言</b>

    C/C++中兩種宏實現方式

    #ifndef的方式受C/C++語言標準支持。它不僅可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件(或者代碼片段)不會被不小心同時包含。
    的頭像 發表于 04-19 11:50 ?701次閱讀

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C
    的頭像 發表于 04-14 11:43 ?2766次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?861次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    為什么很少用C++開發單片機

    C語言是面向過程的語言C++是面向對象的編程語言。結合本文來說,面向過程相比面向對象的編程,生成代碼量(bin文件)更小,運行效率更高。
    發表于 03-25 14:26 ?1142次閱讀
    為什么很少用<b class='flag-5'>C++</b>開發單片機

    C語言#define的應用

    C/C++ 編程語言中,當程序被編譯時,被發送到編譯器,編譯器將程序轉換為機器語言,然后完成編譯并執行該程序。預處理器也稱為宏預處理器。
    發表于 03-06 11:29 ?426次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>#define的應用
    百家乐优惠现金| 大发888国际娱乐城| 网上百家乐内幕| 杨公24山属性| 百家乐官网庄闲出现几| 爱赢百家乐官网的玩法技巧和规则| 豪华百家乐官网桌子厂家 | 大发888促销代码| 大发888官方hgx2dafa888gwd| 大发888娱乐城官方免费下载| 名仕棋牌官网| 巴厘岛百家乐的玩法技巧和规则| 百家乐老是输| 永利百家乐的玩法技巧和规则| 威尼斯人娱乐代理注册| 太阳城7778886| 香港六合彩网址大全| 靖西县| 百家乐官网注码投注论坛| 大发888缺少casino组件common| 大发888在线下载| 宁夏| 百家乐官网赌博赌博平台| 百家乐官网娱乐网网77scs| 百家乐官网网哪一家做的最好呀 | 永利百家乐官网娱乐| 百家乐官网游戏试玩免费| 百家乐官网赌场赌场平台| 24山向阴阳图| 百家乐连锁| 九游棋牌大厅| 百家乐官网平台开发| 巴彦淖尔市| 百家乐官网大赌场娱乐网规则 | 百家乐注册彩金| 百家乐博彩的玩法技巧和规则 | 澳门百家乐加盟| 累积式百家乐的玩法技巧和规则| 大发888官网sscbcgsesb| 海门市| 百家乐官网赌术大揭秘|