例外メッセージに例外の場所に関する情報を含めたい。
だから私はこのようなものをいくつか持っていたいです。
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
その定義は明らかに間違っています。これを達成する方法は?
例外メッセージに例外の場所に関する情報を含めたい。
だから私はこのようなものをいくつか持っていたいです。
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
その定義は明らかに間違っています。これを達成する方法は?
そのマクロを 2 つのレベルで展開する必要があります。
#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)
理由は次のとおりです。
__LINE__
に渡す前に、2 つのレベルで展開する必要があります#x
。
まず第一に#
、関数のようなマクロで operator を使用すると、その後にマクロパラメーターが続く必要がありますが__LINE__
、パラメーターではないため、コンパイラーはそれが浮遊演算子であると不平を言います。
一方、__LINE__
それ自体はマクロであり、現在の行番号が含まれています。 で使用する前に番号に展開する必要があります。そうしないと、番号の代わりに#
文字列が返されます。"__LINE__"
マクロは行番号にS2(__LINE__)
展開__LINE__
され、その行番号を に渡し#x
ます。