gpt4 book ai didi

c++ - 禁用 __LINE__ 宏?

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:02 25 4
gpt4 key购买 nike

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

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

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

最佳答案

__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]; }

如果您的用户收到异常,他应该在他/她/它发生编程错误的地方进行调试。

关于c++ - 禁用 __LINE__ 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11743808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com