目前我在Windows上使用WinAPI。我不喜欢尝试\ catch所以我使用RAII,这是我经常使用的构造:
#define r_free(N, T, F, n) \
struct N { \
T res; \
N() : res(NULL) {} \
~N() { if (res) F(res); } \
} n
这个宏允许我编写如下代码:
r_free(Hndl, HANDLE, ::CloseHandle, f);
DWORD err;
if(INVALID_HANDLE_VALUE == (f.res = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISING, 0, NULL))) {
err = GetLastError();
std::cout << err << std::endl;
return err;
}
它工作正常,但并非所有WinAPI函数(免费资源都需要)都采用一个参数。也许有一种方法可以编辑上面的宏来解决这个问题?有什么更好的方法呢?