C++ C++;:关于运行时警告错误和消息的最佳实践是什么? 今天上午刚刚开始玩SDL2,虽然在这里的例子中使用SDL是不相关的,为了这个问题,我们可以考虑任何能产生运行时错误的框架/工具包/库。

C++ C++;:关于运行时警告错误和消息的最佳实践是什么? 今天上午刚刚开始玩SDL2,虽然在这里的例子中使用SDL是不相关的,为了这个问题,我们可以考虑任何能产生运行时错误的框架/工具包/库。,c++,c,error-handling,macros,runtime-error,C++,C,Error Handling,Macros,Runtime Error,开始编写以下代码: if(SDL_Init(SDL_INIT_VIDEO) < 0) { std::cerr << SDL_GetError() << std::endl; } 我的假设是,这是作为宏实现的。如果条件的计算结果为真,则输出中将出现消息。(cout/cerr) 使用这样的宏可能会在某种程度上解决上述问题,不过我听说了 在C或C++程序中,错误消息和警告消息的处理有哪些最佳实践?有哪些好的解决方案可用,何时使用合适 为此使用宏是一种很好的做法

开始编写以下代码:

if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
    std::cerr << SDL_GetError() << std::endl;
}
我的假设是,这是作为宏实现的。如果
条件
的计算结果为
,则输出中将出现
消息
。(
cout
/
cerr

使用这样的宏可能会在某种程度上解决上述问题,不过我听说了

    在C或C++程序中,错误消息和警告消息的处理有哪些最佳实践?有哪些好的解决方案可用,何时使用合适
      为此使用宏是一种很好的做法。它支持隐式使用
      \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
      \uuuuuuu func\uuuuuuuuuuuu
      等。例如,
      BOOST\u THROW\u EXCEPTION
      为您打包所有有关异常的元数据

      就我个人而言,我总是创建一组特定于项目的宏,类似于
      DT\u THROW\u IF
      。这允许在抛出站点捕获完整的元数据,而不会造成混乱。如果宏构造正确,就没有缺点,而且它们很少需要修改或维护


      作为我所说的一个例子,这里有一个开源的项目,我有这样的宏:它们是用GCC测试的,欢迎使用它们。

      不要同时添加C++和C标记,它们是完全不同的。正如您在问题中所说明的,有很多方法可以实现这一点,没有一种比另一种更客观。也许更适合于?我使用类似boost的记录器:登录我几乎所有的应用程序。@RichardCritten这不是真的。除了简单之外,我给出的例子在所有可能的度量中都是客观地糟糕。对于C++的所有模板和对象愚蠢行为,它从来没有完全取代宏。所有关于坏宏的讨论都是为了阻止新手程序员过度使用它们。有趣的练习:为那些没有实现vararg宏但仍然捕获
      \uuuu文件\uuuuu
      \uu行\uuuu
      \uu函数\uuuuu
      @AndrewHenle的旧编译器编写日志宏:我链接的宏依赖于C++11(可变模板),不仅仅是变量宏。我会惊讶地发现一个编译器支持前者,但不支持后者……但可能有一个。
      \uuuuuuuu文件
      \uuuuuu行
      与宏有什么关系?什么是
      \uuuu函数
      ,你是说标准的
      \uuuuuu函数
      ?这些都不依赖于预处理器。@Lundin函数和其他抽象工具在应该抛出错误的源代码中没有内联。如果在
      报告错误
      函数中使用
      \uuuu行
      ,那么
      \uu行
      将引用该函数,而不是调用方,正如您从错误报告中所期望的那样。这样,我们可能会得到
      std::source\u位置最终。。。
      
      DT_THROW_IF(condition, "message");