【发布时间】:2016-09-17 20:32:47
【问题描述】:
我正在使用 boost_logging(第 2 版),我希望避免在我的代码中乱扔这些:
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 如果我添加分号,则会出现同样的错误。我在发布之前尝试过;)谢谢!这让我明白部分问题是宏是行敏感的,如果我跳过我的宏并将两个宏调用粘贴在我试图记录的相关函数的同一行上,我会得到同样的错误信息。这个换行插入技巧对我不起作用:stackoverflow.com/a/2567304/232593
-
好的,我的愚蠢评论让你进步了。这是另一个:您是否比较了
g++ -E的输出有和没有你的宏?
标签: c++ boost macros boost-log