为什么 boost 在函数中实现 BOOST_CURRENT_FUNCTION

ath*_*hos 6 c++ macros boost

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

....
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 6

在查看完整实现时,您会发现它使用了几个特定于编译器的“函数签名”宏。这些宏当然只在函数内部有效。

测试#elif defined(__FUNCSIG__)将在文件范围内失败。所以必须出现在函数内部。这里引入了 helper 来为这个检查提供一个函数作用域。

MSDN 上文档证实了这一点:

  • __FUNCSIG__定义为包含封闭函数签名的字符串文字。宏仅在函数内定义。