记录每次踩过的坑方便查询.
1. Q:循环包含头文件
场景说明
项目中有两个头文件(define.h
和ClientUDP.h
),ClientUDP
类中需要用到define.h
中的类型定义.
define.h
中定义函数指针类型
时需要用到ClientUDP.h
中的类定义
这就导致两个头文件循环包含???
编译不通过
ClientUDP.h
相关代码
#pragma once
#include "define.h"
#include "Result.h"
class NetWorkUDP;
// 客户端连接
class ClientUDP
{
friend class NetWorkUDP;
public:
// 发送数据
// @param data 数据字节码数组
// @param len 字节码长度
Result send(CByteArray* data, const int len);
};
define.h
相关代码
#pragma once
// 这里导致循环引用
#include "ClientUDP.h"
#ifndef NET_WORK_HANDLE_FUNC
#define NET_WORK_HANDLE_FUNC
//UDP数据处理函数
//@param _this 调用者
//@param ip 客户端IP
//@param data 原始数据
//@param startPos 有效数据开始位置
//@param len 数据总长度
typedef void (*UdpHandleFunc) (void* _this, ClientUDP* clientUdp, CByteArray data, int startPos, int len);
#endif // !NET_WORK_HANDLE_FUNC
A:解决方案
在define.h
中去掉类型定义头文件(ClientUDP.h
), 同时在使用的地方使用class Type var
做提前声明
#pragma once
// 这里导致循环引用
// #include "ClientUDP.h"
#ifndef NET_WORK_HANDLE_FUNC
#define NET_WORK_HANDLE_FUNC
//UDP数据处理函数
//@param _this 调用者
//@param ip 客户端IP
//@param data 原始数据
//@param startPos 有效数据开始位置
//@param len 数据总长度
typedef void (*UdpHandleFunc) (void* _this,class ClientUDP* clientUdp, CByteArray data, int startPos, int len);
#endif // !NET_WORK_HANDLE_FUNC
Q:动态加载dll后, 延迟卸载
场景说明:
程序中需要动态加载各种组件, 同时希望在调用unload(string modName)
时才卸载
先前按照正常思维, 通过new
的方式获取指针再卸载.(失败)
A:解决方案
HINSTANCE
的定义在wtypes.h
中, 本身就是一个指针. 因此直接使用即可
typedef void *HINSTANCE;
使用场景
// 已加载dll
map<string, HINSTANCE> loadedDlls;
...
// 卸载dll
FreeLibrary(loadedDlls[moduleName]);
loadedDlls.erase(moduleName);