【问题标题】:Is there a list of minimum gcc version supporting each __attribute__?是否有支持每个 __attribute__ 的最低 gcc 版本列表?
【发布时间】:2011-02-23 23:28:10
【问题描述】:

这里的官方文档只列出了极少数属性所需的最低版本:

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

是否有每个属性添加到哪个版本的完整列表?更好的是列表还显示哪些与 pcc 和 tcc 兼容。

【问题讨论】:

  • pcc?我想那不是加拿大长老会……
  • 你为什么在乎?您的目标是真正旧版本的 GCC 吗?
  • @Adam 也许 OP 知道如何编写可移植代码并希望通过适当的版本保护来保护这些属性的使用。
  • @Adam Rosenfield:这有关系吗?
  • pcc 是pcc.ludd.ltu.se

标签: c gcc attributes


【解决方案1】:
【解决方案2】:

对于很多有用的,您可以从 glib 的 gmacros.h 中复制 gcc 版本测试: http://git.gnome.org/browse/glib/tree/glib/gmacros.h

根据您的项目,您也可以只使用 GLib,然后直接使用 G_GNUC_NORETURN 或其他替代 __attribute__

按照 Juliano 的建议,原则上执行 HAVE_GCC_ATTRIBUTE_NORETURN 可能会更好,但也可能是 YAGNI 的工作,具体取决于您的项目。

【讨论】:

    【解决方案3】:

    帮自己一个忙,不要那样做。

    也许您的软件有一些预编译配置/设置阶段(比如 autoconf 团队......呃!(shivers)或更理智的东西,比如 CMake),使用它。

    编写小测试(autoconf 宏)来检查编译器是否接受您感兴趣的__attribute__ 以及它是否按预期工作。如果成功,请在源代码中包含的 config.h 文件中编写 HAVE_GCC_ATTRIBUTE_XXX 宏。

    然后使用带有#ifdef 的宏来测试您是否应该将属性放入函数中,或者您是否应该使用其他技巧来模拟缺少属性。

    【讨论】:

    • 我不同意这个答案有几个原因。无论您是硬编码版本还是测试支持,作为开发人员,您都需要知道您依赖什么来决定如何处理不支持它的编译器。对于每个已知编译器都支持的属性(例如const),如果它不存在则选择不实现任何回退是合理的,并且如果该属性不可用则简单地让编译器生成冗余函数调用......
    • ...而仅在最近的 gcc 版本中支持的其他属性,或者仅在 gcc 但其他编译器中不支持的其他属性可能需要更精细的后备,或者(更有可能)不应该在除非它们带来了其他方式无法实现的重大实际利益。
    • 你说得对,这取决于你想知道的为什么 - 如果你决定在代码中使用哪些属性,那么知道哪些版本支持它们是相关的到你的决策。但是在构建时,直接检查支持而不是检查编译器版本更好,因为这将允许您支持您没有考虑过可能实现该属性的其他编译器(icc?clang?)。
    • 顺便说一下,我正在处理的一个可能像这样危险的属性是regparm。我正在处理一个(设计不佳)定义的库 ABI,其中声明了一个公共函数regparm(i386 上的通过寄存器传递),但我希望我的代码和接口头文件可以移植到非 gcc 编译器。我认为我的解决方案只是包含 i386 的内联 asm 以进行函数调用... :-(
    猜你喜欢
    • 1970-01-01
    • 2022-07-19
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多