2

我知道这是一个简单的问题,但我正在寻找我的 C++ 凹槽。abort我想可以使用某种功能。但我认为这不会返回任何文本die('hello');

4

3 回答 3

7

C 或 C++ 中没有“打印消息,然后退出”。die您可以很容易地为(或者panic,我更喜欢这样称呼它)编写自己的函数,例如:

void die(const std::string& msg)
{
    std::cerr << msg << std::endl;
    exit(1);
}

或者,如果您想避免创建字符串的问题,在内存不足的情况下可能会失败:

void die(const char *msg)
... 

(其余应与上述相同)。这里的缺点是你不能简单地连接字符串,例如die(std::string("Could not open file ") + filename);不能使用const char *.

执行此操作的函数var_dump要困难得多,因为在 C++ 中没有直接的方法来实际获取任意类型的变量或数组的内容。你也许可以做这样的事情:

template<typename T>
void var_dump(const T& var)
{
   std::cout << var << endl;
}

template<typename T, size_t N>
void var_dump(const T (&var)[N])
{
   for(i : var)
   {
      std::cout << i << endl;
   }
}

后者有点像这样的 PHP 代码:foreach($var as $i) echo $i . "\n";. 而且我的语法可能有点错误,不确定。

于 2013-10-14T20:50:10.560 回答
2

我不建议打电话std::abortstd::exit类似的事情。

这是蛮力的,正确清理的语义非常复杂。你基本上把你的程序(至少部分)留在了一个非常混乱的状态。

C++ 中一个更好的方法是抛出一个异常,然后捕获main

#include <stdexcept>

struct fatal_error : std::logic_error {
    fatal_error(char const* message) : std::logic_error(message) { }
};

int main() try {
    … the normal program flow starts here
} catch (fatal_error const& e) {
    std::cerr << e.what() << '\n';
    return EXIT_FAILURE;
}

然后,die您只需说. 而不是throw fatal_error("Something went wrong.");.

于 2013-10-14T21:01:16.253 回答
0

假设您需要这些等价物来进行调试...

而不是die()你可以调用调试器;

您可以使用调试器检查变量内容,而不是var_export() 。

于 2013-10-14T21:44:40.283 回答