【问题标题】:C++ - is there any way to get the current executing lineC++ - 有没有办法获得当前的执行行
【发布时间】:2011-02-25 08:41:58
【问题描述】:

我需要创建一个异常处理,因为我还要求打印操作的状态,比如

“文件打开:操作成功完成”

"文件关闭:操作成功完成",

等等

有没有像__LINE__,__FUNCTION__,__FILE__这样的宏?

或者是否有任何增强功能可以做到这一点?

【问题讨论】:

  • 我没有看到标题与问题其余部分之间的关​​系?
  • 您是在询问获取程序正在运行的当前行吗?就像您在逐步调试器中所做的那样?
  • @ereOn 完全正确。我想在执行时查看每一行(如调试器)。
  • 所以我可以建议你改写你的问题来表明这一点吗?正如它所说,真的很难理解你真正想要实现的目标。

标签: c++ visual-c++ macros logic


【解决方案1】:

我认为答案是你想对你正在评估的表达式进行字符串化?

代码:

#include <stdexcept>
#include <sstream>
#include <iostream>

void check_result(bool result, const char* file, int line_number, const char* line_contents)
{
    if (!result) {
        //for example:
        std::stringstream ss;
        ss << "Failed: " << line_contents << " in " << file << ' ' << line_number;
        throw std::runtime_error(ss.str());
    }
}

#define CALL_AND_CHECK(expression) check_result((expression), __FILE__, __LINE__, #expression)

bool foobar(bool b) { return b; }

int main()
{
    try {
        CALL_AND_CHECK(foobar(true));
        CALL_AND_CHECK(foobar(false));
    } catch (const std::exception& e) {
        std::cout << e.what() << '\n';
    }
}

【讨论】:

    【解决方案2】:

    __LINE____FILE__ 在 C++ 中都可用,就像在 C 中一样。唯一需要注意的是它们是宏,在编译时扩展,所以如果你把它们放在宏或模板中,它们可能会也可能不会做你想做的事。

    【讨论】:

      【解决方案3】:

      我不确定你到底在问什么,但这里有一个来自我自己的库的代码示例:

      /**
       * \brief Convenient alias to create an exception.
       */
      #define EXCEPTION(type,msg) type((msg), __FUNCTION__, __FILE__, __LINE__)
      

      基本上,这让我可以写:

      throw EXCEPTION(InvalidParameterException, "The foo parameter is not valid");
      

      当然,InvalidParameterException 是我设计的一个类,它接受额外的参数来保存函数、文件和创建异常的行。

      它有如下构造函数:

      InvalidParameterException::InvalidParameterException(
        const std::string& message,
        const std::string& function,
        const std::string& file,
        int line);
      

      当然,如果您不想抛出异常而只是输出一些内容到日志文件,那么您显然可以使用相同的“技巧”。

      希望这会有所帮助。

      【讨论】:

      • 我需要当前行。像 pITask->open()。运行应用程序时,此行必须反映在屏幕中。
      • @prabhakaran:好吧,你必须告诉我们“当前行”是什么。 __LINE__ 扩展为写入它的行号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2016-03-16
      相关资源
      最近更新 更多