有没有一种简单的方法可以查看一个类是否已在翻译单元中实例化? C++ Primer 中的一个练习询问每个带标签的语句,是否发生实例化:
template <typename T> class Stack { };
void f1(Stack<char>); // (a)
class Exercise {
Stack<double> &rsd; // (b)
Stack<int> si; // (c)
};
int main() {
Stack<char> *sc; // (d)
f1(*sc); // (e)
int iObj = sizeof(Stack< string >); // (f)
}
我不确定如何真正检查我的答案。我想也许我可以为每个类类型使用显式实例化(例如extern template class Stack<char>
),然后在程序中永远不会有相应的显式实例化定义。这样,如果实例化了某些东西,如果定义后来没有出现,那么链接器就会引发错误。
然而编译器/链接器并不总是能识别这样的错误:
template <typename T> class A{ };
extern template class A<int>;
int main(){
A<int> a;
}
这在 gcc 4.9.2 上编译得很好。然而,如果这是我的程序中唯一的目标文件,据我从 N3337 的 [14.7.2][11] 可以看出,这应该是一个错误:
如果一个实体是同一翻译单元中显式实例化声明和显式实例化定义的主题,则定义应遵循声明。作为主题的实体
显式实例化声明,并且其使用方式也会导致翻译单元中的隐式实例化(14.7.1),应成为程序中某处显式实例化定义的主题;否则程序格式错误,无需诊断。
(我猜“不需要诊断”就是为什么这不会引发错误?)。或者,每当不完整的类类型对于表达式不可行时,实例化就会发生 - 这样我就可以通过删除以下定义来进行检查Stack
?
template <typename T> class Stack;
那么每个不完整的类型错误都对应于实例化发生的地方吗?
您可以在可执行文件上使用 nm 工具。这将显示哪个文件包含函数定义。 gcc 还提供了一个标志来在进行链接时去除未使用的函数。
使用“-fdata-sections”进行编译,将数据保存在单独的数据部分中,使用“-ffunction-sections”进行编译,将函数保存在单独的部分中,因此如果不使用它们(数据和函数),可以将其丢弃。
与“--gc-sections”链接以删除未使用的部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)