欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c/c++單例模式類的混合編譯案例詳解

 更新時間:2022年10月09日 15:04:05   作者:Fat_Markov  
? 由于c語言中沒有類的概念,因此對于有類的cpp文件與c文件混合編譯時,提供一個中間層提供類的操作接口,在c文件中調用接口實現(xiàn)間接操作類對象,這篇文章主要介紹了c/c++單例模式類的混合編譯的相關資料

C/C++混合編譯

難點:c++支持重載,因此g++編譯后的函數(shù)名有額外信息,在gcc編譯的c文件中無法識別符號,導致鏈接失敗。

解決方案:

  • extern “C” { }
  • 中間層調用 extern “C”

? 對c++文件編譯時使用extern “C“ { },讓編譯器安裝c語言的規(guī)則對其中的內(nèi)容進行編譯,主要解決c++中重載函數(shù)名導致符號不識別的問題。

? 同時配合ifdef __cplusplusendif實現(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ù)組乘積)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言函數(shù)棧幀的創(chuàng)建與銷毀原理圖解

    C語言函數(shù)棧幀的創(chuàng)建與銷毀原理圖解

    我們知道c語言中函數(shù)都是被調用的,main函數(shù)里面能調用其他函數(shù),其實main函數(shù)也是被別的函數(shù)調用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧
    2022-05-05
  • C++跳轉語句之Goto對變量定義的影響詳解

    C++跳轉語句之Goto對變量定義的影響詳解

    goto語句也被稱為無條件轉移語句,這篇文章主要介紹了C++跳轉語句之Goto對變量定義的影響,文中通過示例代碼解文字介紹的很詳細,相信對大家的理解和學習具有一定的參考借鑒價值,有需要的朋友們下面跟著小編一起來學習學習吧。
    2016-11-11
  • c++與c中的數(shù)組初始化默認值如何為0

    c++與c中的數(shù)組初始化默認值如何為0

    這篇文章主要介紹了c++與c中的數(shù)組初始化默認值如何為0問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++中二叉堆排序詳解

    C++中二叉堆排序詳解

    這篇文章主要介紹了C++中二叉堆排序詳解,主要介紹了二叉堆排序(遞歸和非遞歸實現(xiàn)上沉、下沉算法),需要的朋友可以參考下
    2023-01-01
  • C語言庫函數(shù)qsort的使用及模擬實現(xiàn)

    C語言庫函數(shù)qsort的使用及模擬實現(xiàn)

    這篇文章主要介紹了C語言庫函數(shù)qsort的使用及模擬實現(xiàn),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 詳解C++11中的線程庫

    詳解C++11中的線程庫

    線程是操作系統(tǒng)中的一個概念,線程對象可以關聯(lián)一個線程,用來控制線程以及獲取線程的狀態(tài),這篇文章主要介紹了C++11中的線程庫的相關知識,需要的朋友可以參考下
    2022-01-01
  • 利用C++實現(xiàn)通訊錄管理系統(tǒng)的完整代碼

    利用C++實現(xiàn)通訊錄管理系統(tǒng)的完整代碼

    通訊錄是一個可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關于利用C++實現(xiàn)通訊錄管理系統(tǒng)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā))

    Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā))

    這篇文章主要介紹了Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā)),需要的朋友可以參考下
    2020-03-03
  • C語言項目全正整數(shù)后再計算的三種參考解答方法

    C語言項目全正整數(shù)后再計算的三種參考解答方法

    今天小編就為大家分享一篇關于C語言項目全正整數(shù)后再計算的三種參考解答方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02

最新評論