【问题标题】:Using GCC extensions with code compiled with clang?将 GCC 扩展与使用 clang 编译的代码一起使用?
【发布时间】:2017-03-29 21:59:12
【问题描述】:

我有两个关于 GCC 扩展的问题

  1. 如果我使用 GCC 属性/扩展来编译库,即使我将它们链接到使用 clang 编译的程序,它们是否也能工作?

  2. 是否应该在函数声明或原型中声明函数属性/扩展?

【问题讨论】:

    标签: c gcc


    【解决方案1】:
    1. 如果属性/扩展只影响代码生成而不影响接口,它应该可以工作。

    2. 取决于属性。 例如,pureconstnonnull 之类的属性是不好的,除非每个使用函数的翻译单元都能看到它们——你应该把它们放在标题中的原型上(并使用下划线形式,例如,__attribute__((__pure__)))。

      另一方面,影响代码生成或可见性的属性应该在实现中,否则如果您的库用户决定覆盖您的库提供的函数,包括您的标头,将有效地强制这些属性对其进行覆盖.

    在任何情况下,如果您在声明中添加一个属性,它也会影响定义(假设定义看到声明——感谢Jonathan Leffler 的澄清),但定义可以采用其他属性中不存在的声明。

    【讨论】:

    • 你说:“如果你在声明上加上一个属性,它也会影响定义”——只要定义看到声明,我就会同意,但情况并非总是如此(众所周知,人们编码草率)。也就是说,如果他们遇到“定义未见的声明”问题,他们就会遇到更大的问题。
    【解决方案2】:

    这取决于扩展名。

    https://clang.llvm.org/docs/LanguageExtensions.html

    本文档描述了 Clang 提供的语言扩展。在 除了此处列出的语言扩展之外,Clang 旨在支持 广泛的 GCC 扩展。请参阅 GCC 手册了解更多信息 有关这些扩展的信息。

    【讨论】:

    • 我更想知道是否可以使用带有属性的 gcc 编译库,然后让它与其他编译器一起使用,因为它已经编译了。我对 clang 没有特别的兴趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多