我有两个关于GCC扩展的问题
如果我使用GCC属性/扩展编译库,即使我将它们链接到使用例如clang
编译的程序,它们也会工作吗?
是否应在函数声明或原型中声明函数属性/扩展名?
答案 0 :(得分:2)
如果属性/扩展只影响代码生成而不影响接口,那么它应该可以工作。
取决于属性。
例如,pure
,const
或nonnull
等属性并不好,除非每个使用这些函数的翻译单元都可以看到它们 - 您应该将它们放在标题中的原型上(并使用下划线形式,例如__attribute__((__pure__))
)。
另一方面,影响代码生成或可见性的属性应该在实现上,否则如果库用户决定覆盖库提供的函数,包括头部将有效地强制它们的覆盖上的这些属性
在任何情况下,如果你在声明上放置一个属性,它也会影响定义(假设定义看到声明 - 感谢Jonathan Leffler澄清),但定义可以采用其他不存在的属性在声明中。
答案 1 :(得分:0)
这取决于扩展名。
请参阅https://clang.llvm.org/docs/LanguageExtensions.html
本文档描述了Clang提供的语言扩展。在 除了这里列出的语言扩展,Clang旨在支持 广泛的GCC扩展。有关更多信息,请参阅GCC手册 有关这些扩展的信息。