我想做的(用于记录目的)是这样的:
编写此代码是为了显示我的问题,实际代码很复杂,是的,即使在 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
,在调用之前未扩展宏)
有什么方法可以在不使用技巧的情况下获得相同的行为?