私がやりたいこと(ログの目的で)は次のようなものです:
このコードは私の問題を示すために書かれています。実際のコードは複雑です。はい、C++ でもマクロを使用する十分な理由があります =)
# define LIB_SOME 1
# define LIB_OTHER 2
# define WHERE "at file #a, line #l, function #f: "
// (look for syntax hightlighting error at SO xd)
# define LOG_ERROR_SIMPLE(ptr, lib, str) ptr->log ("ERROR " str \
" at library " #lib);
# define LOG_ERROR(ptr, lib, str) LOG_ERROR_SIMPLE(ptr, lib, WHERE str)
LOG_ERROR_SIMPLE (this, LIB_SOME, "doing something")
LOG_ERROR (this, LIB_OTHER, "doing something else")
LOG_ERROR_SIMPLE()
lib パラメーター (" " で囲まれたマクロ名) の文字列化を書き込みます。
ただし、LOG_ERROR
既に展開されているマクロの文字列化 ("2") を書き込みます。lib は展開して呼び出す前に展開されているため、これは予期されたものLOG_ERROR_SIMPLE
です。しかし、これは私が必要とするものではありません。
基本的に私の質問は次のとおりです。別のマクロ関数を呼び出すときに、マクロ関数パラメーターのマクロ展開を回避する方法は?
マクロ展開を回避するために私が使用するトリックがあります。
LOG_ERROR(ptr, lib, str, x) LOG_ERROR_SIMPLE(ptr, x##lib, WHERE str)
LOG_ERROR(this, LIB_OTHER, "some error",)
(x と lib を貼り付けると生成LIB_OTHER
され、この値は を呼び出すために使用されますLOG_ERROR_SIMPLE
。その呼び出しの前に展開されたマクロではありません)
トリックを使用せずにこれと同じ動作を取得する方法はありますか?