c/c++單例模式類的混合編譯案例詳解
C/C++混合編譯
難點:c++支持重載,因此g++編譯后的函數(shù)名有額外信息,在gcc編譯的c文件中無法識別符號,導致鏈接失敗。
解決方案:
- extern “C” { }
- 中間層調用 extern “C”
? 對c++文件編譯時使用extern “C“ { },讓編譯器安裝c語言的規(guī)則對其中的內(nèi)容進行編譯,主要解決c++中重載函數(shù)名導致符號不識別的問題。
? 同時配合ifdef __cplusplus
和endif
實現(xiàn)文件(主要是頭文件)被gcc和g++編譯時能夠自動匹配當前編譯器的語言。另一方面也是因為c語言不支持extern “C”關鍵字。
中間層調用
? 由于c語言中沒有類的概念,因此對于有類的cpp文件與c文件混合編譯時,提供一個中間層提供類的操作接口,在c文件中調用接口實現(xiàn)間接操作類對象。
log案例
背景:main.c中需要調用logClass.cpp文件中的logClass類的相關成員函數(shù),并且該類是一個單例模式。
解決方案:
文件目錄
│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; }; #endif
logClass.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") #設置c++的編譯選項 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") #設置c的編譯選項 include_directories(include) add_executable(mylogtest main.c src/logClass.cpp src/interFace.cpp)
到此這篇關于c/c++單例模式類的混合編譯的文章就介紹到這了,更多相關c++混合編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(152.求最大子數(shù)組乘積)
這篇文章主要介紹了C++實現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C語言函數(shù)棧幀的創(chuàng)建與銷毀原理圖解
我們知道c語言中函數(shù)都是被調用的,main函數(shù)里面能調用其他函數(shù),其實main函數(shù)也是被別的函數(shù)調用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧2022-05-05C語言庫函數(shù)qsort的使用及模擬實現(xiàn)
這篇文章主要介紹了C語言庫函數(shù)qsort的使用及模擬實現(xiàn),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08利用C++實現(xiàn)通訊錄管理系統(tǒng)的完整代碼
通訊錄是一個可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關于利用C++實現(xiàn)通訊錄管理系統(tǒng)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā))
這篇文章主要介紹了Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā)),需要的朋友可以參考下2020-03-03