c/c++单例模式类的混合编译案例详解

 更新时间:2022年10月09日 15:04:05   作者:Fat_Markov  
​ 由于c语言中没有类的概念,因此对于有类的cpp文件与c文件混合编译时,提供一个中间层提供类的操作接口,在c文件中调用接口实现间接操作类对象,这篇文章主要介绍了c/c++单例模式类的混合编译的相关资料

C/C++混合编译

难点:c++支持重载,因此g++编译后的函数名有额外信息,在gcc编译的c文件中无法识别符号,导致链接失败。

解决方案:

  • extern “C” { }
  • 中间层调用 extern “C”

​ 对c++文件编译时使用extern “C“ { },让编译器安装c语言的规则对其中的内容进行编译,主要解决c++中重载函数名导致符号不识别的问题。

​ 同时配合ifdef __cplusplusendif实现文件(主要是头文件)被gcc和g++编译时能够自动匹配当前编译器的语言。另一方面也是因为c语言不支持extern “C”关键字。

中间层调用

​ 由于c语言中没有类的概念,因此对于有类的cpp文件与c文件混合编译时,提供一个中间层提供类的操作接口,在c文件中调用接口实现间接操作类对象。

log案例

背景:main.c中需要调用logClass.cpp文件中的logClass类的相关成员函数,并且该类是一个单例模式。

解决方案:

文件目录

│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++混合编译内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++如何实现简单的计时器详解

    C++如何实现简单的计时器详解

    因为最近闲着无聊就想着要不用C++写点什么东西,仔细想了想其实自己的C++学的也不怎么好,写个简单的计时器吧!所以下面这篇文章主要介绍了利用C++如何实现简单的计时器,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 如何解决C语言,函数名与宏冲突

    如何解决C语言,函数名与宏冲突

    本文介绍了“如何解决C语言,函数名与宏冲突”,需要的朋友可以参考一下
    2013-03-03
  • c++ 内联函数和普通函数的区别

    c++ 内联函数和普通函数的区别

    内联函数是c++为了提高程序的运行速度做的改进,那么内联函数和普通函数的区别是什么,本文就来详细的介绍一下,感兴趣的朋友可以了解一下
    2021-05-05
  • 从汇编看c++函数的默认参数的使用说明

    从汇编看c++函数的默认参数的使用说明

    本篇文章介绍了,在c++中函数的默认参数的使用说明分析。需要的朋友参考下
    2013-05-05
  • 深入了解C++ 结构体(struct)与共用体(union)

    深入了解C++ 结构体(struct)与共用体(union)

    这篇文章主要介绍了C++ 结构体与共用体的的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • 基于C语言实现图书管理信息系统设计

    基于C语言实现图书管理信息系统设计

    这篇文章主要为大家详细介绍了基于C语言实现图书管理信息系统设计与实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言字符串压缩之ZSTD算法详解

    C语言字符串压缩之ZSTD算法详解

    快速压缩工具zstd(zstandard)是由facebook开源的快速无损压缩算法,主要应用于zlib级别的实时压缩场景,并且具有更好的压缩比。本文将来讲讲ZSTD算法的使用,需要的可以参考一下
    2022-08-08
  • C++ OpenCV实现boxfilter方框滤波的方法详解

    C++ OpenCV实现boxfilter方框滤波的方法详解

    box filter的作用很简单,即对局部区域求平均,并把值赋给某个点,一般我们赋给区域中心。本文将用C++实现boxfilter方框滤波,需要的可以了解一下
    2022-10-10
  • C语言实现24点游戏计算器的示例代码

    C语言实现24点游戏计算器的示例代码

    24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,使最后的计算结果是24的一个数学游戏,24点可以考验人的智力和数学敏感性,它能在游戏中提高人们的心算能力。本文将用C语言实现这一游戏,感兴趣的可以了解一下
    2022-08-08
  • 详解C++14中返回类型推导的使用

    详解C++14中返回类型推导的使用

    这篇文章主要为大家详细介绍了C++14中返回类型推导的使用,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07

最新评论