__LINE__
宏从不禁用。它在你写它的地方扩大了。有写代码两种方式(更确切地说,有两种方法可以产生令牌):
如果你有它的一些文件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]; }
如果您的用户将收到一个异常,他应该调试那些他/她/它发生编程错误。
也许这个是类似于你的问题 http://stackoverflow.com/questions/3026649/getting-information-about-where-c-exceptions-are-thrown-inside-of-catch-block – 2012-07-31 15:48:02