例外メッセージに例外の場所に関する情報を含めたい。
だから私はこのようなものをいくつか持っていたいです。
#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ます。