我应该检查什么预处理器条件才能使用 __attribute__((const))?
What preprocessor condition should I check so as to use __attribute__((const))?
我得到了一段将 __attribute__((const))
应用于某些函数的代码。现在,我宁愿在它可用时不删除它,但另一方面,我确实希望更便携,所以 - 我想说
#if some condition here
#define ATTRIBUTE(an_attribute) __attribute__((an_attribute))
#else
#define ATTRIBUTE(an_attribute)
#endif
void foo(int x) ATTRIBUTE(const)
条件应该是什么?
备注:
- 我知道,对于 C++17,我们将其作为一个适当的 C++ 属性;但我不能假设使用了 C++17。事实上,让我们假设这不是为了让事情变得简单。
- 如果您也能回答
__attribute__((pure))
的问题,则加分。
GCC 在 C++11 中引入的 standard attribute syntax 下提供了这些属性:
[[gnu::const]] // or [[gnu::pure]]
void foo(int x);
从 C++17 开始,编译器需要忽略未知属性而不导致错误。实际上,编译器通常会对未知属性发出警告(当然,可以选择关闭该警告)。根据我在 Compiler Explorer 上看到的和我记得的,早于 C++17 的编译器通常也会在完全理解语法后发出警告。我要进一步测试的主要编译器是 MSVC,但 Compiler Explorer 在 MSVC 版本中并没有走得太远。
如果您已经有了宏并且不想更改它的所有用途,您可以在以下位置进行操作:
#define ATTRIBUTE(an_attribute) [[gnu::an_attribute]]
如果这不是一个合理的解决方案,不幸的是,我怀疑您必须检查条件下的特定编译器和版本。
__attribute__
是 GNU 扩展。只有 GNU 编译器和自称是 GNU 的编译器(如 Clang 和 ICC)才支持它。所以你可以这样做:
#ifdef __GNUC__
# define ATTRIBUTE(x) __attribute__ (x)
# else
# define ATTRIBUTE(x)
#endif
const
在 GCC 2.5 中引入,pure
在 GCC 2.96 开发期间引入,因此单独测试它们的支持没有意义:这些编译器版本将无法编译当前无论如何都是C ++代码。 (__attribute__
本身是用GCC 2.0引入的,我想C++前端一直支持它。)
我得到了一段将 __attribute__((const))
应用于某些函数的代码。现在,我宁愿在它可用时不删除它,但另一方面,我确实希望更便携,所以 - 我想说
#if some condition here
#define ATTRIBUTE(an_attribute) __attribute__((an_attribute))
#else
#define ATTRIBUTE(an_attribute)
#endif
void foo(int x) ATTRIBUTE(const)
条件应该是什么?
备注:
- 我知道,对于 C++17,我们将其作为一个适当的 C++ 属性;但我不能假设使用了 C++17。事实上,让我们假设这不是为了让事情变得简单。
- 如果您也能回答
__attribute__((pure))
的问题,则加分。
GCC 在 C++11 中引入的 standard attribute syntax 下提供了这些属性:
[[gnu::const]] // or [[gnu::pure]]
void foo(int x);
从 C++17 开始,编译器需要忽略未知属性而不导致错误。实际上,编译器通常会对未知属性发出警告(当然,可以选择关闭该警告)。根据我在 Compiler Explorer 上看到的和我记得的,早于 C++17 的编译器通常也会在完全理解语法后发出警告。我要进一步测试的主要编译器是 MSVC,但 Compiler Explorer 在 MSVC 版本中并没有走得太远。
如果您已经有了宏并且不想更改它的所有用途,您可以在以下位置进行操作:
#define ATTRIBUTE(an_attribute) [[gnu::an_attribute]]
如果这不是一个合理的解决方案,不幸的是,我怀疑您必须检查条件下的特定编译器和版本。
__attribute__
是 GNU 扩展。只有 GNU 编译器和自称是 GNU 的编译器(如 Clang 和 ICC)才支持它。所以你可以这样做:
#ifdef __GNUC__
# define ATTRIBUTE(x) __attribute__ (x)
# else
# define ATTRIBUTE(x)
#endif
const
在 GCC 2.5 中引入,pure
在 GCC 2.96 开发期间引入,因此单独测试它们的支持没有意义:这些编译器版本将无法编译当前无论如何都是C ++代码。 (__attribute__
本身是用GCC 2.0引入的,我想C++前端一直支持它。)