C++ 强制clang为类模板实例化的从未引用过的静态成员函数发出代码
我可以在C++ 强制clang为类模板实例化的从未引用过的静态成员函数发出代码,c++,gcc,clang,C++,Gcc,Clang,我可以在gcc中使用used和noinline(参见下面的代码)轻松实现这一点,但这在clang中不起作用,即使它应该支持这两个函数属性 一个简化的例子: template<typename T> struct Factory { static __attribute__((used, noinline)) T createFoo() { return T(); } }; int main() { Factory<int> f; // insta
gcc
中使用used
和noinline
(参见下面的代码)轻松实现这一点,但这在clang
中不起作用,即使它应该支持这两个函数属性
一个简化的例子:
template<typename T>
struct Factory {
static __attribute__((used, noinline))
T createFoo() { return T(); }
};
int main() {
Factory<int> f; // instantiate and use Factory<int>
}
代码在clang
中编译得很好,但它不会像预期的那样为静态createFoo()
函数发出代码
如何强制clang发出这个从未被引用过的静态函数?这肯定是clang中的一个bug。
正如OP在注释中所述,\uuuuuu attribute\uuuuuu((使用))
的语义是将函数视为代码中实际引用的函数,强制它为函数发出代码,而在本例中clang没有这样做
此外,所有类成员函数都有C++定义的外部链接。因此,当类被实例化时,编译器(支持gcc风格的函数attibutes)看到成员函数的
\uuuuu attribute\uuuuu((使用))
,它应该立即知道应该发出该函数的外部可见定义gcc正在这样做,bugclang没有
一个临时的解决方法(对于clang)是显式地引用代码中的某个函数
您还需要解决此问题。此行为超出标准,因此不需要编译器支持。可移植的解决方案是添加对该方法的引用。@brianbeuning:我意识到编译器不需要支持它-我的问题是
clang
是否支持它。(它应该像gcc
一样,通过used
函数属性,告诉编译器假装它在某个地方被引用过。)感谢您的确认-我会继续并提交一个bug报告。所以这仍然是一个带有Clang 10的bug,嗯
nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()