c/c++中一些不常用但有用的知识

1.变长数组

cpp 复制代码
bool fun(int cnt)
{
    unsigned char data[cnt];
    return true;
}

在 C 语言中,变长数组(Variable Length Arrays,VLA)是 C99 标准引入的特性,允许使用变量来定义数组的长度。因此,在 C 版本的代码中,可以使用您提供的方式来动态申请数组,前提是编译器支持 C99 标准。

2.c++的函数作为回调函数传给c

cpp 复制代码
class UdpTask : public QObject
{
    Q_OBJECT

public:
    static UdpTask &instance()
    {
        static UdpTask self;
        return self;
    }
     void registration();

signals:
    void sendImage(QImage image);
private:
    explicit UdpTask(QObject *parent = nullptr);
    //~UdpTask();
    UdpTask(const UdpTask &self);
    const UdpTask &operator=(const UdpTask &self);
    static void receivedDataHandle(int frame_id, void* buffer, int buffer_len);
   
};
cpp 复制代码
void UdpTask::receivedDataHandle(int frame_id, void* buffer, int buffer_len)
{
    /* 发送信号 */
    memcpy(instance().image->bits(), &buffer, buffer_len);
    emit instance().sendImage(*instance().image);
}
cpp 复制代码
extern "C" {
    // C 语言写的回调注册函数
typedef void(*eth_recv_func_t)(int frame_id, void* buffer, int buffer_len);
ETHTRANSFERLIB_API int StartReceiveData(eth_recv_func_t func, int data_size);
}

void UdpTask::registration(int len)
{
    StartReceiveData(receivedDataHandle, len);
}

这里用了 C++ 类的静态函数作为回调函数,

静态的单例函数 instance() 用于获取 UdpTask 的唯一实例。

是为了在静态函数中调用其他变量(如image,sendimage等),否则其他变量都需要申请为静态的。

3.动态加载dll

当某些静态库的函数名称与头文件中的声明不匹配时,如下图。一般为编译不规范没有加def文件导致的,我们利用下面命令读一下dll中的信息

cpp 复制代码
dumpbin /headers your_dll_file.dll

这是一段利用qt加载动态库的方法

cpp 复制代码
#include <QLibrary>
#include <QDebug>

int main() 
{
    // 创建 QLibrary 对象并加载动态库
    QLibrary myLib("./lib/xxx.dll");
    if (myLib.load()) 
    {
        // 获取函数地址 可以用之前出现乱码字符串来找到真正的函数
        void* symbol = myLib.resolve("?myFunctionName@@YAXXZ");
        //这样就可以调用了
        symbol();
        // 卸载动态库
        myLib.unload();
    } 
    return 0;
}
相关推荐
布莱克6057 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
沫璃染墨11 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck13 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光14 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记15 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw16 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨16 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光17 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy18 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw19 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别