大多数编译器都支持某些特殊的宏,例如__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/

10-13 07:04