为什么会导致未定义的引用?
struct A { void f(); };
int main()
{
auto f = &A::f;
}
在我得到指针之前,是否必须定义函数?为什么会导致链接器错误?
更新:我刚发现用no optimizations进行编译会给出未定义的引用。
答案 0 :(得分:4)
您希望获取地址为不存在的变量。 (函数,就此而言,是一种常量变量)
你现在拥有的就像一个前瞻性声明。您声明了一个函数但没有实现它(它类似于缺少extern
变量)。
地址本身应该在链接期间给出,但是当链接器搜索它时,它就会丢失。
此外,该功能可以在main函数之后实现,甚至可以在其他文件中实现,但编译器在串行处理中一次处理一个文件。因此,编译器无法知道该功能未在任何地方实现。
所以没有编译错误,因为有前向声明,并且名称已知,但是由于使用了函数但没有实现,因此存在链接错误。
答案 1 :(得分:1)
它没有实现,因此该函数不存在,并且链接器无法找到它来获取其地址。而不是:
struct A { void f(); };
使用:
struct A { void f() {} };