gpt4 book ai didi

c++ - 检查编译器是否支持 __FUNC__ 等的最佳方法是什么

转载 作者:行者123 更新时间:2023-11-28 02:36:45 26 4
gpt4 key购买 nike

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

它引用:

The identifier __func__ is implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";

appeared, where function-name is the name of the lexically-enclosing function. This name is the unadorned name of the function.

这表明 __func__ 和许多其他“魔法宏”根本就不是宏,因此不会被 #ifdef 选中

关于c++ - 检查编译器是否支持 __FUNC__ 等的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com