我使用boost_logging(第2版),我想避免在我的代码,乱扔垃圾这些:如何合并生成唯一标识符的两个boost日志记录宏?
BOOST_LOG_NAMED_SCOPE("SomeModuleName")
BOOST_LOG_FUNCTION()
我想第二个是,我宁愿他们在这样的宏观相结合:
#define LOG_NAMED_SCOPE_FUNCTION(name)\
BOOST_LOG_NAMED_SCOPE(name)\
BOOST_LOG_FUNCTION()
但是当我尝试这样做时出现错误。见下文。
我会特别满意的解决方案,允许我在模块级别执行类似BOOST_LOG_NAMED_SCOPE("SomeModuleName")
(也出错)。更好的办法是做一些RAII/AOP的解决方案,让我也可以在函数的开始和结尾添加“输入”和“退出”跟踪消息,因为这是我的最终目标。
我猜测是因为生成的唯一标识符在宏定义的位置扩展,而不是在宏调用时扩展。我也看了一下DEFERRED和EXPAND助手,但我不确定他们会帮助我。
这里的错误消息:
Project/SomeModuleName.cpp:9:5: error: redefinition of '_boost_log_named_scope_sentry_9'
LOG_NAMED_SCOPE_FUNCTION("SomeModuleName")
^
Project/Logging.hpp:24:5: note: expanded from macro 'LOG_NAMED_SCOPE_FUNCTION'
BOOST_LOG_FUNCTION()
^
/usr/local/include/boost/log/attributes/named_scope.hpp:458:36: note: expanded from macro 'BOOST_LOG_FUNCTION'
BOOST_LOG_NAMED_SCOPE_INTERNAL(BOOST_LOG_UNIQUE_IDENTIFIER_NAME(_boost_log_named_scope_sentry_), BOOST_CURRENT_FUNCTION, __FILE__, __LINE__, ::boost::log::attributes::named_scope_entry::function)
^
/usr/local/include/boost/log/utility/unique_identifier_name.hpp:48:5: note: expanded from macro 'BOOST_LOG_UNIQUE_IDENTIFIER_NAME'
BOOST_LOG_UNIQUE_IDENTIFIER_NAME_INTERNAL(prefix, __LINE__)
^
note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/usr/local/include/boost/preprocessor/cat.hpp:22:32: note: expanded from macro 'BOOST_PP_CAT'
# define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
^
/usr/local/include/boost/preprocessor/cat.hpp:29:34: note: expanded from macro 'BOOST_PP_CAT_I'
# define BOOST_PP_CAT_I(a, b) a ## b
^
<scratch space>:89:1: note: expanded from here
_boost_log_named_scope_sentry_9
^
Project/SomeModuleName.cpp:9:5: note: previous definition is here
Project/Logging.hpp:23:5: note: expanded from macro 'LOG_NAMED_SCOPE_FUNCTION'
BOOST_LOG_NAMED_SCOPE(name)\
^
/usr/local/include/boost/log/attributes/named_scope.hpp:449:36: note: expanded from macro 'BOOST_LOG_NAMED_SCOPE'
BOOST_LOG_NAMED_SCOPE_INTERNAL(BOOST_LOG_UNIQUE_IDENTIFIER_NAME(_boost_log_named_scope_sentry_), name, __FILE__, __LINE__, ::boost::log::attributes::named_scope_entry::general)
^
/usr/local/include/boost/log/utility/unique_identifier_name.hpp:48:5: note: expanded from macro 'BOOST_LOG_UNIQUE_IDENTIFIER_NAME'
BOOST_LOG_UNIQUE_IDENTIFIER_NAME_INTERNAL(prefix, __LINE__)
^
note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/usr/local/include/boost/preprocessor/cat.hpp:22:32: note: expanded from macro 'BOOST_PP_CAT'
# define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
^
/usr/local/include/boost/preprocessor/cat.hpp:29:34: note: expanded from macro 'BOOST_PP_CAT_I'
# define BOOST_PP_CAT_I(a, b) a ## b
^
<scratch space>:85:1: note: expanded from here
_boost_log_named_scope_sentry_9
^
不确定,但你有没有尝试插入分号? :'#define LOG_NAMED_SCOPE_FUNCTION(name)\ BOOST_LOG_NAMED_SCOPE(name); \ BOOST_LOG_FUNCTION()'(对不起,如果它很愚蠢,但我真的不明白如何有这个错误:它应该工作,期间) –
@ Jean-FrançoisFabre如果我添加分号,则会出现同样的错误。我在发布之前尝试过);但是谢谢!这让我明白,问题的一部分是宏是线路敏感的,如果我跳过我的宏并将两个宏调用粘贴在相关函数的同一行上,我试图记录,我得到相同的错误信息。这个换行插入技巧并没有为我工作,虽然:http://stackoverflow.com/a/2567304/232593 –
好吧,所以我愚蠢的评论让你进步。下面是另外一个例子:你是否比较了g ++ -E的输出和没有宏的情况? –