大多数编译器都支持某些特殊的宏,例如__FUNC__
或__PRETTY_FUNCTION__
,但我想知道如何在编译期间验证这些宏是否可用,来自boost / current_function.hpp的Boost宏:
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600))
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
#elif defined(__DMC__) && (__DMC__ >= 0x810)
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
#elif defined(__FUNCSIG__)
# define BOOST_CURRENT_FUNCTION __FUNCSIG__
#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))
# define BOOST_CURRENT_FUNCTION __FUNCTION__
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
# define BOOST_CURRENT_FUNCTION __FUNC__
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
# define BOOST_CURRENT_FUNCTION __func__
#else
# define BOOST_CURRENT_FUNCTION "(unknown)"
#endif
但是,真的需要这么复杂吗?难道不是可以
#ifdef __PRETTY_FUNCTION__
代替它,以便即使在boost或编写宏的人未知的编译器上也可以使用此宏?例如:#if defined(__PRETTY_FUNCTION__)
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
#elif defined(__FUNCSIG__)
# define BOOST_CURRENT_FUNCTION __FUNCSIG__
#elif (defined(__FUNCTION__)
# define BOOST_CURRENT_FUNCTION __FUNCTION__
#elif defined(__FUNC__)
# define BOOST_CURRENT_FUNCTION __FUNC__
#elif defined(__func__)
# define BOOST_CURRENT_FUNCTION __func__
#else
# define BOOST_CURRENT_FUNCTION "(unknown)"
#endif
有什么区别?它适用于所有编译器吗?
最佳答案
请参见https://stackoverflow.com/a/4384825/583195。
它引用:
标识符__func__
由翻译器隐式声明为
如果,紧随每个功能的打开括号
定义,声明
static const char __func__[] = "function-name";
出现在哪里
function-name是词法包围函数的名称。这个
name是函数的未经修饰的名称。
这表明__func__
和许多其他“魔术宏”根本不是宏,因此#ifdef
不会拾取它们。
关于c++ - 检查编译器是否支持__FUNC__等的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27174929/