今天早上再次开始使用SDL2,虽然这里的示例中使用SDL的事实并不相关,但为了这个问题的目的,我们可以考虑任何可能产生运行时错误的框架/工具包/库。 / p>
开始编写以下代码:
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
std::cerr << SDL_GetError() << std::endl;
}
我认为这不是很好。
如果我们需要,这种向cerr
输出消息的方式将来不容易改变。如果我们想要将错误消息打印到文件中,那么我们必须查找此代码的所有出现,并将cout
更改为文件。这显然不实用或不容易。
它不是很灵活。也许我们可能想要有错误,警告和一般信息消息。他们可能需要根据用户配置程序的方式去不同的地方。也许有些用户希望看到所有警告和信息,而其他人只想看到最“关键”的错误信息。
从其他项目开始,我看到的东西看起来像宏。
例如,以下是我的想法:
DT_THROW_IF(condition, "message");
我的假设是这是作为宏实现的。如果condition
评估为true
,则输出中会显示message
。 (cout
/ cerr
)
使用像这样的宏可能会解决上述问题,但我听说it is not good practice to make extensive uses of macros。
答案 0 :(得分:3)
使用宏是一种很好的做法。它允许隐式使用__FILE__
,__LINE__
,__func__
等。例如,BOOST_THROW_EXCEPTION
将所有关于异常的元数据捆绑在一起。
我个人总是创建一个与您的DT_THROW_IF
类似的项目特定宏集。这允许在抛出站点捕获完整元数据而不会混乱。如果宏构造得当,没有缺点,很少需要修改或维护。
作为我所谈论的一个例子,这里有一个我的开源项目,它有这样的宏:https://github.com/jzwinck/pccl/blob/master/throw.hpp - 它们经过生产测试(使用GCC),欢迎你使用它们。 / p>