为什么以下代码编译

时间:2013-04-11 19:24:31

标签: c++ linker

#include<iostream>
using namespace std;
class Foo {
void Bar( void ) const ;
};
int main()
{
  Foo f;
  cout<<sizeof(f)<<endl;
}

我在g ++上运行它,它没有给我任何编译错误。此外,它执行了给出正确的o / p 1。但我期待,链接期间出错。这个编译器是否依赖?

3 个答案:

答案 0 :(得分:11)

我只能想象您预计会收到错误,因为Foo::Bar未定义。标准中的一个定义规则仅要求定义使用的元素。在您的特定情况下,程序中没有任何内容使用 Foo::Bar,因此程序不需要该定义。

答案 1 :(得分:3)

这将链接,因为没有对Foo :: Bar的未完成引用,并且不需要它的定义。如果你真的尝试过调用f.bar()这会给你错误。

答案 2 :(得分:3)

没有链接器错误,因为所有依赖项都已解析。

只要调用方法Bar()并且没有定义它,就会出现链接器错误。因为那时你引用Bar()并且链接器无法解析它。