C++等效于带有错误的 fprintf

C++ equivalent of fprintf with error

本文关键字:fprintf 有错误 于带 C++      更新时间:2023-10-16

如果我有一条错误消息,由以下人员调用:

if (result == 0)
{
    fprintf(stderr, "Error type %d:n", error_type);
    exit(1);
}

C++版本吗?在我看来,fprintfC而不是C++.我看到了与cerrstderr有关的东西,但没有可以取代上述的例子。或者也许我完全错了,fprintfC++的标准?

所有[除了少数例外,C和C++在标准方面发生冲突]有效的C代码在技术上也是有效的(但不一定是"好的")C++代码。

我个人会把这段代码写成:

if (result == 0) 
{
   std::cerr << "Error type " << error_type << std:: endl;
   exit(1);
}

但是在C++中还有几十种其他方法可以解决这个问题(其中至少有一半也可以在 C 中工作,无论是否经过一些修改)。

一个非常合理的解决方案是throw异常 - 但这只有在调用代码[在某个级别]catch该异常时才真正有用。像这样:

if (result == 0)
{
    throw MyException(error_type);
}

然后:

try
{
  ... code goes here ... 
}
catch(MyException me)
{
    std::cerr << "Error type " << me.error_type << std::endl;
}

你可能在你的第一个Hello World!程序中听说过std::cout,但C++还有一个std::cerr函数对象。

std::cerr << "Error type " << error_type << ":" << std::endl;

C++ 等效的就是使用 std::cerr

#include <iostream>
std::cerr << "Error type " << error_type << ":n";

如您所见,它使用您熟悉的其他流的典型operator<<语法。

C++代码而是使用std::ostream和文本格式运算符(无论它是否表示文件)

void printErrorAndExit(std::ostream& os, int result, int error_type) {
    if (result == 0) {
        os << "Error type " << error_type << std::endl;
        exit(1);
    }
}

要使用专用于文件的std::ostream,可以使用 std::ofstream

stderr文件描述符映射到std::cerr std::ostream实现和实例。