41

例外メッセージに例外の場所に関する情報を含めたい。

だから私はこのようなものをいくつか持っていたいです。

#define LOCATION __FILE__ " : " __LINE__

throw std::exception(std::string("ABCD. ") + LOCATION);

その定義は明らかに間違っています。これを達成する方法は?

4

1 に答える 1

70

そのマクロを 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ます。

于 2013-10-13T08:29:12.367 に答える