__LINE__
宏永远不会被禁用。它在你写它的地方展开。有两种编写代码的方法(更准确地说,有两种生成令牌的方法):
如果你有它是foo.cpp
这样的文件(只是示例性的,实际上这是非常糟糕的代码)
class Foo {
public:
Frob operator[] (size_t) { throw __LINE__ }
};
then__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
,或者像标准库那样做:
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]; }
如果您的用户收到异常,他应该调试他/她/它发生编程错误的地方。