2

我得到了一段适用__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))
4

2 回答 2

2

GCC在 C++11 中引入的标准属性语法下提供了这些属性:

[[gnu::const]] // or [[gnu::pure]]
void foo(int x);

从 C++17 开始,编译器需要忽略未知属性而不导致错误。在实践中,编译器通常会警告未知属性(当然,可以选择关闭该警告)。根据我在 Compiler Explorer 上看到的情况以及我所记得的情况,C++17 之前的编译器通常也会在完全理解语法后发出警告。我将进一步测试的主要编译器是 MSVC,但编译器资源管理器在 MSVC 版本中并没有走得太远。

如果您已经拥有宏并且不想更改其所有用途,则可以在以下位置进行操作:

#define ATTRIBUTE(an_attribute) [[gnu::an_attribute]]

如果这不是一个合理的解决方案,我怀疑您将不得不检查条件中的特定编译器和版本,不幸的是。

于 2019-10-20T19:05:33.390 回答
1

__attribute__是一个 GNU 扩展。只有 GNU 编译器和声称是 GNU 的编译器(例如 Clang 和 ICC)支持它。所以你可以这样做:

#ifdef __GNUC__
# define ATTRIBUTE(x) __attribute__ (x)
# else
# define ATTRIBUTE(x)
#endif

const是在 GCC 2.5 和pureGCC 2.96 开发期间引入的,因此单独测试它们的支持是没有意义的:这些编译器版本无论如何都无法编译当前的 C++ 代码。(__attribute__本身是在 GCC 2.0 中引入的。我认为 C++ 前端一直支持它。)

于 2019-10-21T07:19:14.593 回答