【问题标题】:c++ defining function using #define macro to check com resultc ++定义函数使用#define宏来检查com结果
【发布时间】:2015-12-16 22:09:22
【问题描述】:

所以我正在开发一个 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 块中的错误语法引起的。有人能指出我的语法有什么问题吗?

【问题讨论】:

  • 你有没有想过使用std::system_error
  • 您是否考虑过内联函数?它们往往比宏更容易调试
  • 函数和宏是完全不同的东西。
  • 贴出使用这些宏的代码

标签: c++ macros predefined-macro


【解决方案1】:

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

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

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

【讨论】:

  • 这不能回答问题。
  • 它确实很好地回答了这个问题。
  • @CrazyEddie - “为什么这段代码不能编译?” “好吧,这里有一些不同的代码可以编译。”是的,可以合理地说这种方法效果不佳,但我在这里看不到任何地方。只是关于预处理和代码示例的漫谈。
  • 谢谢。它解决了编译器问题。只要把它内联就可以了。
  • @CalvinHu 如果你真的认为它有帮助 - 支持它。如果您认为它可以解决问题 - 标记为解决方案 :)
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多