0

所以我正在开发一个 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,则抛出错误。第二个尝试将错误代码转换为人类可读的字符串并返回。这是我得到的错误(我使用的 ide 是 qt creator,但这没关系): 在此处输入图像描述

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

4

1 回答 1

1

定义宏告诉预处理器用它的定义替换定义的内容。所以如果你去

#define SAMPLE_TEXT 5

预处理器会将所有SAMPLE_TEXTs 替换为 5。宏函数稍微复杂一些。所以如果你去

#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())))

考虑避免在此处使用宏,并使这些宏函数只是常规函数。让编译器决定天气是否内联它们。

于 2015-12-16T22:23:36.490 回答