c ++使用#define宏定义函数来检查com结果

时间:2015-12-16 22:09:23

标签: c++ macros predefined-macro

所以我正在开发一个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创建者,但这并不重要): enter image description here

它说_com_error是非法使用的,我认为其他错误是由#define块中的错误语法引起的。有人可以指出我的语法有什么问题吗?

1 个答案:

答案 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())))

考虑避免在这里使用宏并使这些宏功能只是常规功能。让编译器决定天气是否内联。