建设银行瓶窑支行网站,阿里域名官网,2345浏览器官网首页,网络架构部1.变长数组
bool fun(int cnt)
{unsigned char data[cnt];return true;
} 在 C 语言中#xff0c;变长数组#xff08;Variable Length Arrays#xff0c;VLA#xff09;是 C99 标准引入的特性#xff0c;允许使用变量来定义数组的长度。因此#xff0c;在 C 版本的代码…1.变长数组
bool fun(int cnt)
{unsigned char data[cnt];return true;
} 在 C 语言中变长数组Variable Length ArraysVLA是 C99 标准引入的特性允许使用变量来定义数组的长度。因此在 C 版本的代码中可以使用您提供的方式来动态申请数组前提是编译器支持 C99 标准。
2.c的函数作为回调函数传给c
class UdpTask : public QObject
{Q_OBJECTpublic: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 QDebugint main()
{// 创建 QLibrary 对象并加载动态库QLibrary myLib(./lib/xxx.dll);if (myLib.load()) {// 获取函数地址 可以用之前出现乱码字符串来找到真正的函数void* symbol myLib.resolve(myFunctionNameYAXXZ);//这样就可以调用了symbol();// 卸载动态库myLib.unload();} return 0;
}