【问题标题】:Disabled __LINE__ macro?禁用 __LINE__ 宏?
【发布时间】:2012-07-31 15:37:12
【问题描述】:

我想做一些异常处理。我计划使用__LINE____FILE__ 宏。

我有一些头文件 Vectors.hpp,我在其中为向量结构实现了一些类。在这个类中,我实现了operator [],并且每次将此运算符与越界索引一起使用时,我都想抛出一个异常。我在一些源代码 test.cpp 中测试这个类。然后我希望能够在 test.cpp 中看到发生这种情况的确切行。

但是我知道每次包含一些标头时都会禁用 __LINE__ 宏,所以我得到的是 Vectors.hpp 中我处理异常的行,而不是 test.cpp 中的行。有没有一个很好的方法来解决这个问题?或者,如何实现自己的__LINE__ 宏?

【问题讨论】:

标签: c++ macros


【解决方案1】:

__LINE__ 宏永远不会被禁用。它在你写它的地方展开。有两种写代码的方式(更准确地说,有两种产生token的方式):

  • 手动编写
  • 使用预处理器编写代码

如果你有这样的文件foo.cpp(只是示例,实际上这是非常糟糕的代码)

class Foo {
public:
    Frob operator[] (size_t) { throw __LINE__ }
};

那么__LINE__ 总是3,__FILE__ 总是foo.cpp

这是因为宏在使用它们的地方展开。解决方案是找到一种方法将它们扩展到您想要的位置,而这样做的唯一方法是定义另一个宏:

#define safe_subscript(foo, index) \
      try {foo[index];} \
      catch(...) { std::cout << __LINE__ << '\n'; }

....
safe_subscript(foo, 256);

但正如您所见,这会导致代码和变通方法非常难看。

真正的解决方案:只要在越界时抛出异常 (throw std::out_of_range),或者像 the standard library 那样做:

T& operator[] (size_type i) { return store_[i]; }
T& at (size_type i) { if (i>size_) throw std::out_of_range("crap");
                      return store_[i]; }

T operator[] (size_type i) const { return store_[i]; }
T at (size_type i) const { if (i>size_) throw std::out_of_range("crap");
                           return store_[i]; }

如果您的用户收到异常,他应该调试他/她/它在哪里发生了编程错误。

【讨论】:

    【解决方案2】:

    您可以将当前行作为异常的一部分传递。将您的异常定义为

    struct MyException : public std::exception {
        MyException(const char* line) : errorLine(line);
        const char* errorLine;
    };
    

    并按如下方式使用:

    if (isError())
         throw MyException(__LINE__);
    

    【讨论】:

      【解决方案3】:

      很简单,您必须在捕获异常时添加该信息,通常我们会创建一个扩展 std::exception 的类,该类具有一些附加属性,用于安装明确的错误消息,其中包括 __LINE__ 、 @987654323 @甚至__FUNCTION__

      这个也回答了: Getting information about where c++ exceptions are thrown inside of catch block?

      【讨论】:

        猜你喜欢
        • 2018-05-12
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 2016-05-07
        • 2019-10-05
        • 2012-11-09
        • 2011-07-01
        • 2016-02-16
        相关资源
        最近更新 更多