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

1.变长数组

bool fun(int cnt)
{
    unsigned char data[cnt];
    return true;
}

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

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

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);
   
};
void UdpTask::receivedDataHandle(int frame_id, void* buffer, int buffer_len)
{
    /* 发送信号 */
    memcpy(instance().image->bits(), &buffer, buffer_len);
    emit instance().sendImage(*instance().image);
}
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中的信息

dumpbin /headers your_dll_file.dll

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

#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;
}

相关推荐

  1. C语言一些函数

    2023-12-09 11:32:01       38 阅读
  2. 工作一些sql脚本

    2023-12-09 11:32:01       33 阅读
  3. Linuxshell`cp`命令,`cp -a`

    2023-12-09 11:32:01       22 阅读
  4. 这些 MySQL 法,99% 人都知道

    2023-12-09 11:32:01       34 阅读
  5. 标定系列——OpenCVCV_16S场合(二十六)

    2023-12-09 11:32:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 11:32:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 11:32:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 11:32:01       87 阅读
  4. Python语言-面向对象

    2023-12-09 11:32:01       96 阅读

热门阅读

  1. GO设计模式——15、责任链模式(行为型)

    2023-12-09 11:32:01       63 阅读
  2. Android 获取进程名称

    2023-12-09 11:32:01       63 阅读
  3. 前端学习--React(5)

    2023-12-09 11:32:01       52 阅读
  4. React查询、搜索类功能的实现

    2023-12-09 11:32:01       60 阅读
  5. ReactJs笔记摘录

    2023-12-09 11:32:01       71 阅读
  6. K8S学习指南(2)-docker的基本使用

    2023-12-09 11:32:01       52 阅读
  7. Solidity学习教程

    2023-12-09 11:32:01       49 阅读
  8. BGP综合

    BGP综合

    2023-12-09 11:32:01      51 阅读
  9. C语言精选——选择题Day40

    2023-12-09 11:32:01       59 阅读
  10. 【力扣100】9.和为k的子数组

    2023-12-09 11:32:01       71 阅读
  11. vue基本运用之常见问题及案例代码

    2023-12-09 11:32:01       53 阅读
  12. error: overloaded function with no contextual type information

    2023-12-09 11:32:01       50 阅读
  13. 爬虫解析-BeautifulSoup-bs4(七)

    2023-12-09 11:32:01       55 阅读
  14. vue+vite+diff.js使用方法

    2023-12-09 11:32:01       51 阅读
  15. npm、yarn常用命令

    2023-12-09 11:32:01       61 阅读