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_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 <QDebug>int main()
{// 创建 QLibrary 对象并加载动态库QLibrary myLib("./lib/xxx.dll");if (myLib.load()) {// 获取函数地址 可以用之前出现乱码字符串来找到真正的函数void* symbol = myLib.resolve("?myFunctionName@@YAXXZ");//这样就可以调用了symbol();// 卸载动态库myLib.unload();} return 0;
}