我应该检查什么预处理器条件才能使用 __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)

条件应该是什么?

备注:

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++前端一直支持它。)