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