c/c++單例模式類的混合編譯案例詳解
C/C++混合編譯
難點(diǎn):c++支持重載,因此g++編譯后的函數(shù)名有額外信息,在gcc編譯的c文件中無(wú)法識(shí)別符號(hào),導(dǎo)致鏈接失敗。
解決方案:
- extern “C” { }
- 中間層調(diào)用 extern “C”
? 對(duì)c++文件編譯時(shí)使用extern “C“ { },讓編譯器安裝c語(yǔ)言的規(guī)則對(duì)其中的內(nèi)容進(jìn)行編譯,主要解決c++中重載函數(shù)名導(dǎo)致符號(hào)不識(shí)別的問(wèn)題。
? 同時(shí)配合ifdef __cplusplus和endif實(shí)現(xiàn)文件(主要是頭文件)被gcc和g++編譯時(shí)能夠自動(dòng)匹配當(dāng)前編譯器的語(yǔ)言。另一方面也是因?yàn)閏語(yǔ)言不支持extern “C”關(guān)鍵字。
中間層調(diào)用
? 由于c語(yǔ)言中沒(méi)有類的概念,因此對(duì)于有類的cpp文件與c文件混合編譯時(shí),提供一個(gè)中間層提供類的操作接口,在c文件中調(diào)用接口實(shí)現(xiàn)間接操作類對(duì)象。
log案例
背景:main.c中需要調(diào)用logClass.cpp文件中的logClass類的相關(guān)成員函數(shù),并且該類是一個(gè)單例模式。
解決方案:
文件目錄
│main.c
├─include
│ interFace.h
│ logClass.h
│
└─src
interFace.cpp
logClass.cpp
源代碼
main.c
#include "interFace.h"
#include <stdint.h>
#include <stdio.h>
int main()
{
set_log_count(10);
uint32_t count = get_log_count();
printf("The conut is %d\n", count);
}
logClass.h
#ifndef LOG_CLASS_H
#define LOG_CLASS_H
#include <stdint.h>
#include <stdio.h>
#define FCA_BOOL uint16_t
#define FCA_TRUE 1
#define FCA_FALSE 0
class logClass
{
public:
static logClass *getInstance()
{
static logClass m_plogClass;
return &m_plogClass;
}
FCA_BOOL setLogCount(uint32_t num);
uint32_t getLogCount();
private:
logClass();
logClass(const logClass &) = delete;
logClass &operator=(const logClass &) = delete;
~logClass();
uint32_t m_logCount;
static logClass* m_plogClass;
};
#endiflogClass.cpp
#include "logClass.h"
logClass::logClass(/* args */)
{
printf("log class construct!!!!!\n");
}
logClass::~logClass()
{
printf("log class destruct!!\n");
}
FCA_BOOL logClass::setLogCount(uint32_t num)
{
m_logCount = num;
return FCA_TRUE;
}
uint32_t logClass::getLogCount()
{
return m_logCount;
}interFace.cpp
#include "interFace.h"
#include "logClass.h"
logClass* log = logClass::getInstance();
FCA_BOOL set_log_count(uint32_t num)
{
FCA_BOOL ret = log->setLogCount(num);
return ret;
}
uint32_t get_log_count()
{
return log->getLogCount();
}
interFace.h
#ifndef INTERFACE_H
#define INTERFACE_H
#include <stdint.h>
#define FCA_BOOL uint16_t
#define FCA_TRUE 1
#define FCA_FALSE 0
#ifdef __cplusplus
extern "C"
{
#endif
FCA_BOOL set_log_count(uint32_t num);
uint32_t get_log_count();
#ifdef __cplusplus
}
#endif
#endif
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(MYLOGTEST CXX C)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #設(shè)置c++的編譯選項(xiàng)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") #設(shè)置c的編譯選項(xiàng)
include_directories(include)
add_executable(mylogtest main.c src/logClass.cpp src/interFace.cpp)
到此這篇關(guān)于c/c++單例模式類的混合編譯的文章就介紹到這了,更多相關(guān)c++混合編譯內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言函數(shù)棧幀的創(chuàng)建與銷(xiāo)毀原理圖解
我們知道c語(yǔ)言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實(shí)main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過(guò)本文給大家分享c語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷(xiāo)毀過(guò)程,一起看看吧2022-05-05
C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響詳解
goto語(yǔ)句也被稱為無(wú)條件轉(zhuǎn)移語(yǔ)句,這篇文章主要介紹了C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響,文中通過(guò)示例代碼解文字介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
C語(yǔ)言庫(kù)函數(shù)qsort的使用及模擬實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言庫(kù)函數(shù)qsort的使用及模擬實(shí)現(xiàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的完整代碼
通訊錄是一個(gè)可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關(guān)于利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Qt串口通信開(kāi)發(fā)之Qt串口通信模塊QSerialPort開(kāi)發(fā)完整實(shí)例(串口助手開(kāi)發(fā))
這篇文章主要介紹了Qt串口通信開(kāi)發(fā)之Qt串口通信模塊QSerialPort開(kāi)發(fā)完整實(shí)例(串口助手開(kāi)發(fā)),需要的朋友可以參考下2020-03-03
C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法
今天小編就為大家分享一篇關(guān)于C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02

