因此,我正在開發一個windows應用程序,並且我決定編寫幾個helper函數來檢查調用時由任何com相關函數返回的HRESULT。我試圖將這些函數定義爲一個宏#define塊,但我真的不知道什麼是適當的語法。以下是#define塊中的兩個函數,第二個函數在我的程序的其他部分調用它時給出編譯器錯誤。使用#define宏來檢查com結果的C++定義函數
#ifndef COMUTILITIES
#define COMUTILITIES
#include <sstream>
#include <fstream>
#include <string>
#include <comdef.h>
#include <AtlConv.h>
#define COM_RESULT_CHECK(ret) \
if (ret != S_OK) { \
std::stringstream ss; \
ss << "failed " #ret " " << std::hex << ret << std::endl; \
throw std::runtime_error(ss.str().c_str()); \
}
#define TO_STRING(ret) \
_com_error err(ret); \
LPCTSTR errMsg = err.ErrorMessage(); \
std::string s = CT2A(errMsg); \
return s; \
#endif // COMUTILITIES
基本上我的目標很簡單。第一個函數檢查com函數的返回碼。如果它不是S_OK,則會引發錯誤。第二個嘗試將錯誤代碼轉換爲可讀的字符串並將其返回。下面是我得到的錯誤(我使用的IDE是Qt Creator的,但是,這並不重要):
它說_com_error被非法使用,和其他錯誤,我相信,通過在不良造成的語法#定義塊。有人能指出我的語法有什麼問題嗎?
你有沒有想過使用['std :: system_error'](http://en.cppreference.com/w/cpp/error/system_error)? – Fireho
您是否考慮過內聯函數?它們往往比宏更容易調試 – kchoose2
函數和宏是完全不同的東西。 –