所以我正在开发一个Windows应用程序,并且我决定编写几个辅助函数来检查调用时由任何与com相关的函数返回的HRESULT。我试图将这些函数定义为宏#define块,但我真的不确定什么是正确的语法。这是#define块中的两个函数,第二个函数在程序的其他部分调用它时会出现编译器错误。
#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,则抛出错误。第二个尝试将错误代码转换为人类可读的字符串并返回它。这是我得到的错误(我使用的是qt创建者,但这并不重要):
它说_com_error是非法使用的,我认为其他错误是由#define块中的错误语法引起的。有人可以指出我的语法有什么问题吗?
答案 0 :(得分:1)
define宏告诉预处理器用它的定义替换定义的内容。 所以,如果你去
#define SAMPLE_TEXT 5
预处理器将用5替换所有SAMPLE_TEXT
s。
宏函数有点复杂。所以,如果你去
#define MACROFUN(a, b) a + b
预处理器会将所有MACROFUN(a, b)
替换为a+b
,而不是替换为(a + b)或使用表达式的结果。因此,转2 * MACROFUN(3,3)
将导致9(2 * 3 + 3 = 9,而不是2 * 6 = 12)。预处理器正在做的工作是粘贴宏功能的内容,用参数替换a,b而不评估任何值。
回到原始问题,要定义一个你需要的宏功能,你应该去
#define TO_STRING( ret ) (std::string(CT2A(_com_error(ret).ErrorMessage())))
考虑避免在这里使用宏并使这些宏功能只是常规功能。让编译器决定天气是否内联。