嵌入式開發程式碼中的extern "C" {的作用
1、在好多程式中我們會遇到下面程式碼段
#ifdef __cplusplus
extern "C" {
#endif
//c語法程式碼段
#ifdef __cplusplus
}
#endif //
首先應該知道,__cplusplus是CPP中的自定義巨集,則表示這是一段cpp的程式碼,編譯器按c++的方式編譯系統.。如果這時候我們需要使用c語言的程式碼,那麼就需要加上(extern "C" { )這一段來說明,要不編譯器會把c程式碼按c++模式編譯,會出現問題。
這句話的意思是:這個程式碼是CPP的程式碼,__cplusplus是cpp中的自定義巨集,因此,以CPP語言的形式編譯,但是裡面的程式碼有C語言的程式碼,那麼就要“extern "C" { ”說明一下,編譯器用C語言的模式編譯。
#ifdef __cplusplus //c++編譯環境中才會定義__cplusplus (plus就是"+"的意思)
extern"C"{ /告訴編譯器下面的函式是c語言函式(因為c++和c語言對函式的編譯轉換不一樣,主要是c++中存在過載)
#endif
要明白為何使用extern "C"{,還得從CPP中對函式的過載處理開始說起。在c++中,為了支援過載機制,在編譯生成的彙編碼中,要對函式的名字進行一些處理,加入比如函式的返回型別等等。而在C中,只是簡單的函式名字而已,不會加入其他的資訊。也就是說:C++和C對產生的函式名字的處理是不一樣的。 加上extern "C"{ 目的,就是主要實現C與C++的相互呼叫問題。
extern "C"是連線申明(linkage declaration),被extern "C"修飾的變數和函式是按照C語言方式編譯和連線的。
1、C++ 呼叫C中函式的例項:
c.h的實現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
c.c的實現
#include "c.h"
void C_fun()
{
}
------------------------------------
在cxx.cpp中呼叫c.c中的C_fun()
cxx.cpp的實現
#include "c.h"
int main()
{
C_fun()
}
C++呼叫C的函式時,在c++的 .h 檔案中加extern "C" {}。
所以關鍵是extern "C" {} ,extern "C"是告訴C++編譯器件括號裡的東東是按照C的obj檔案格式編譯的,要連線的話按照C的命名規則去找。
2、C呼叫C++中的函式CPP_fun()
因為先有C後有C++,所以只能從C++的程式碼中考慮了。加入C++中的函式或變數有可能被C中的檔案掉用,則應該這樣寫,也是用extern "C"{},不過是程式碼中要加,頭文件也要加,因為可能是C++中也呼叫
Cxx.h的實現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void CPP_fun();
#ifdef __cplusplus
}
#endif
#endif
Cxx.cpp的實現
extern "C" { //告訴C+++編譯器,擴號裡按照C的命名規則編譯
void CPP_fun()
{
.....
}
}
c.c的實現
#include "Cpp.h"
int main()
{
CPP_fun()
}
總結:C和C++對函式的處理方式是不同的.extern "C"是使C++能夠呼叫C寫作的庫檔案的一個手段,如果要對編譯器提示使用C的方式來處理函式的話,那麼就要使用extern "C"來說明。
相關文章
- extern "C"的用途—在C++程式碼中嵌入C程式碼C++C程式
- C++中extern的使用C++
- extern "c"的用法
- extern作用詳解
- extern "C"的用法解析
- 開發微信小程式的作用微信小程式
- C語言中extern的用法C語言
- c語言extern的用法C語言
- C# 程式開發中經常遇到的10條實用的程式碼C#
- C#程式開發中經常遇到的10條實用的程式碼C#
- C++中::的作用C++
- 嵌入式安卓開發使用LLDB進行斷點除錯C/C++程式碼安卓LLDB斷點除錯C++
- extern c 解析
- C/C++中extern關鍵字詳解C++
- C中的auto、static、register、extern、const和volitate
- C#中#region,#if的作用C#
- 白碼低程式碼/無程式碼開發平臺功能及作用
- extern "c" 用法解析
- extern "C" __declspec(dllexport)Export
- C++中extern “C”含義深層探索 (轉載)C++
- 低程式碼開發平臺對企業數字化的作用
- 低程式碼開發平臺對於企業IT架構的作用架構
- 在c++程式中呼叫被C編譯器編譯後的函式,為什麼要使用extern “C”C++編譯函式
- js程式碼中的"use strict"的作用是什麼JS
- 前端開發中的程式碼藝術(精要)前端
- 嵌入式軟硬體開發中遇到的坑
- C語言:extern用法C語言
- C語言extern用法C語言
- Spring在開發專案中起的作用Spring
- DevOps中開發的作用和主動性dev
- Java開發中操作日誌的作用和模組Java
- C/C++中Static和Const的作用C++
- 嵌入式C++開發詳解(三)C++
- 開發中的程式碼規範實踐 PHPPHP
- C#中SqlParameter的作用與用法C#SQL
- FinC:國人開發的嵌入式程式語言(轉)
- jsp中的開頭的作用JS
- css程式碼中的加號(+)相鄰選擇器的作用CSS