2012-02-09 87 views
10

我有声明方法但未实现它的Class。该方法不是一个虚拟功能。在相应的cpp文件中,我没有找到相同方法的定义。定义了该类中声明的所有其他方法。在Class中声明但未定义的方法

我编译的代码,它很好。我的印象是,cpp必须强制声明方法的定义。

欣赏是否有人能详细说明。我使用VS2010的编译器。

回答

10

你的代码会被编译,但会给出链接错误。

建设项目的可执行包括两个阶段:

  • 编译
  • 链接

编译编译器通过验证语言语义只是将源代码转换成目标代码。
链接链接器实际上查找符号的定义并从多个对象文件(在编译期间创建)创建一个可执行文件。

编译器分别编译每个翻译单元(.cpp +头文件)中的源代码,因此它假定该定义应该存在于某个其他源文件中。链接器试图找到对函数定义的引用,因此缺失的定义将由链接器报告。

注意链接器需要链接只有那些你的程序中使用符号,
对于例如:如果你的程序中声明了一个功能,没有提供定义&然后再也用途/随时随地调用功能,链接器不需要嵌入用于跳转到函数的目标代码驻留在任何函数调用位置的地址的代码。
鉴于这种情况,链接器根本就不需要查找函数定义。因此,代码将编译和链接。

+5

恕我直言,链接错误只会发生在具有缺失定义的函数被明确/隐式地使用/调用的地方。 – fizzbuzz 2012-02-09 12:02:05

+0

@fizzbuzz:是的,当然。这是基本标准。 – 2012-02-09 14:19:34

+0

我既没有收到任何编译或链接错误。只是为了补充我没有在任何地方使用funtion。代码编译并链接到.lib文件中。 – akrohit 2012-02-09 15:23:22

3

没有要求在特定文件中实现该方法。事实上,它被认为是一种很好的编程习惯,每种方法都有一个文件可以在与库链接时减少膨胀。

这意味着给定一个定义类的头文件(并且可能没有实现),编译器只能假定所有函数都在某处实现。它只是在系统试图将所有东西放在一起(链接阶段)的地步,这就表明你指的是那些不存在的东西。

+0

每**方法一个文件**?似乎过度... – 2012-02-09 11:38:44

+0

不是真的。它使得更少的膨胀和令人惊讶的链接问题。一些现代编译器通过使每个函数处于单独的对象部分来实现这种必要性,但大多数编译器不这样做。 – 2012-02-09 12:51:07

+0

我再次检查,并找不到我在上面在任何其他文件中也谈论的方法的定义。 – akrohit 2012-02-09 15:24:15

3

这是防止分配或复制的常用技术。如果你声明但没有定义它,如果你尝试使用它,就会发生链接错误,即防止人们无意中使用它。

0

编译器没有抱怨,因为没有语法/编译器错误。 链接器不会投诉,因为您没有调用程序中的函数,因此无需链接。