【问题标题】:Wrapping method in a macro in C++在 C++ 中的宏中包装方法
【发布时间】:2016-03-27 22:32:18
【问题描述】:

在我的框架中,我想知道调用方客户端代码的行号、文件路径和方法名称​​。因此,例如,框架有一个方法 B(),客户端使用该框架并在 X 行,文件路径 Y 处调用 B()。对于我做一些错误报告,我想知道 X 和 Y。

对此的明显解决方案是将B() 包装在一个宏中:

#define B() B(__LINE__, __FILE__, ...) 这样客户端就不必指定 __LINE__ 和 __FILE__ 宏。

这是一个好的设计选择,如果不是,如何做到这一点?

【问题讨论】:

  • 这种情况并不少见,尤其是在报告与源代码位置相关的日志信息时。
  • @WhozCraig 那么什么是常见的?
  • 也许具体的否定让你失望了? “并不罕见” = 并不罕见 = 很常见。换句话说,你正在做的事情通常是做的。

标签: c++ debugging error-handling macros


【解决方案1】:

您的方法可能没问题,但如果您必须使用很多这样的方法,您可能需要考虑另一种方法:

struct Location {
   const char *file;
   int line;
};

#define LOC (Location{__FILE__,__LINE__})

struct Framework {
   void B(const Location &);
};

// 客户端代码

Framework f;
f.B(LOC);

如果您有很多像 B 这样的方法,这会减少需要编写的宏的数量,以换取使客户端代码更加乏味。您必须权衡取舍。

【讨论】:

  • 这种方法更好,因为您只需要一个宏即可完成所有操作。您可以为其选择一个名称,以尽量减少干扰任何事物的机会。
猜你喜欢
  • 2011-06-19
  • 2022-11-05
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
相关资源
最近更新 更多