__LINE__
マクロが無効になることはありません。書いたところが展開されます。コードを記述する方法は 2 つあります (より正確には、トークンを生成する方法は 2 つあります)。
- 手書きで書く
- プリプロセッサを使用してコードを記述する
あなたが持っている場合は、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]; }
ユーザーが例外を受け取った場合、プログラミング エラーが発生した場所をデバッグする必要があります。