强制 clang 为类模板实例化的从不引用的静态成员函数发出代码
forcing clang to emit code for never-referenced static member function of class-template instantiation
我可以使用used
和noinline
函数属性在gcc
中轻松实现这一点(请参阅下面的代码),但这在clang
中不起作用,即使它应该支持这两个函数属性。
一个简化的示例:
template<typename T>
struct Factory {
static __attribute__((used, noinline))
T createFoo() { return T(); }
};
int main() {
Factory<int> f; // instantiate and use Factory<int>
}
编译 gcc
中的代码并使用 nm
确认 gcc 正确发出了函数:
nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()
代码在clang
中编译得很好,但它没有像它应该的那样发出静态createFoo()
函数的代码。
如何强制 clang 发出这个从未被引用的静态函数?
这绝对是叮当声中的一个错误。
正如OP在注释中所述,__attribute__((used))
的语义是将函数视为在代码中实际引用的函数,迫使它发出函数的代码,而clang在这种情况下没有这样做。
此外,所有类成员函数都具有由C++定义的外部链接。因此,当类实例化,并且编译器(支持 gcc 样式的函数属性)看到成员函数的__attribute__((used))
时,它应该立即知道应该发出该函数的外部可见定义。GCC正在这样做,Bug Clang没有。
一个临时解决方法(对于 clang)是在代码中的某个位置显式引用该函数。
您还应该向 llvm 提交 clang 错误报告以解决此问题。
相关文章:
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员引用必须相对于特定对象
- 对类的静态成员的未定义引用
- 如何在类静态成员中引用静态变量?
- 结构内部的结构:"对非静态成员的非法引用"错误
- 错误:必须调用对非静态成员函数的引用 (2)
- 必须调用对非静态成员函数的引用(向量)
- 必须调用函子 ->对非静态成员函数的引用
- 对受保护静态成员的未定义引用.我该如何解决
- StringComp:必须调用对非静态成员函数的引用
- C++非静态成员引用
- C++非静态成员引用必须相对于特定对象
- 无法理解错误 msg:"非静态成员引用必须相对于特定对象"
- 非静态成员引用
- 新的新类对象的函数;错误:非静态成员引用必须相对于特定对象
- C++非静态成员引用必须相对于特定对象
- 在另一个类内部构造一个类(非静态成员引用必须相对于特定对象)
- 非静态成员引用必须相对于特定的c++对象单例类
- 错误:非静态成员引用必须相对于特定对象
- C++接口错误,非静态成员引用必须相对于特定对象