为什么在函数中加强实现BOOST_CURRENT_FUNCTION

时间:2017-12-05 06:14:48

标签: c++ boost macros

boost在其current_function.hpp中实现了一个宏BOOST_CURRENT_FUNCTION ,宏是提供函数的全名,用于异常抛出,日志记录等。

有趣的是,宏是在函数内部实现的。

这样做的特殊原因是什么?

....

namespace boost
{

    namespace detail
    {

        inline void current_function_helper()
        {

            #if defined( BOOST_DISABLE_CURRENT_FUNCTION )

                # define BOOST_CURRENT_FUNCTION "(unknown)"

            #elif ...

            #elif defined(__FUNCSIG__)

                # define BOOST_CURRENT_FUNCTION __FUNCSIG__

            #elif ....

            #else

                # define BOOST_CURRENT_FUNCTION "(unknown)"

            #endif

        }

    } // namespace detail

} // namespace boost

....

1 个答案:

答案 0 :(得分:4)

在查看完整实现后,可以看到它使用了几个编译器特定的“函数签名”宏。那些宏当然只在函数中有效

测试#elif defined(__FUNCSIG__)将在文件范围内失败。因此必须出现在函数内部。这里引入了帮助程序来为此检查提供函数范围。

documentation on MSDN证实了这一点:

  
      
  • __ FUNCSIG __ 定义为包含封闭函数签名的字符串文字。宏仅在其中定义   一个功能。
  •