__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