【发布时间】:2017-03-29 21:59:12
【问题描述】:
我有两个关于 GCC 扩展的问题
如果我使用 GCC 属性/扩展来编译库,即使我将它们链接到使用
clang编译的程序,它们是否也能工作?是否应该在函数声明或原型中声明函数属性/扩展?
【问题讨论】:
我有两个关于 GCC 扩展的问题
如果我使用 GCC 属性/扩展来编译库,即使我将它们链接到使用 clang 编译的程序,它们是否也能工作?
是否应该在函数声明或原型中声明函数属性/扩展?
【问题讨论】:
如果属性/扩展只影响代码生成而不影响接口,它应该可以工作。
取决于属性。
例如,pure、const 或 nonnull 之类的属性是不好的,除非每个使用函数的翻译单元都能看到它们——你应该把它们放在标题中的原型上(并使用下划线形式,例如,__attribute__((__pure__)))。
另一方面,影响代码生成或可见性的属性应该在实现中,否则如果您的库用户决定覆盖您的库提供的函数,包括您的标头,将有效地强制这些属性对其进行覆盖.
在任何情况下,如果您在声明中添加一个属性,它也会影响定义(假设定义看到声明——感谢Jonathan Leffler 的澄清),但定义可以采用其他属性中不存在的声明。
【讨论】:
这取决于扩展名。
见https://clang.llvm.org/docs/LanguageExtensions.html
本文档描述了 Clang 提供的语言扩展。在 除了此处列出的语言扩展之外,Clang 旨在支持 广泛的 GCC 扩展。请参阅 GCC 手册了解更多信息 有关这些扩展的信息。
【讨论】: