我有Class声明了一个方法但没有实现它。该方法不是虚函数。在相应的cpp文件中,我没有找到相同方法的定义。在类中声明的所有其他方法都已定义。
我编译了代码,它很顺利。我的印象是cpp必须强制定义声明的方法。
感谢有人可以详细说明。我正在使用VS2010的cl编译器。
答案 0 :(得分:10)
您的代码将编译但会产生链接错误。
构建项目的可执行文件涉及两个阶段:
在编译期间,编译器只需通过验证语言语义将源代码转换为目标代码。
在链接期间,链接器实际上会查找符号的定义,并从多个目标文件(在编译期间创建)中创建可执行文件。
编译器分别编译每个翻译单元(.cpp +头文件)中的源代码,因此它假定定义应存在于某些其他源文件中。链接器试图找到对函数定义的引用,因此链接器将报告缺少的定义。
请注意,链接器只需链接程序使用的那些符号,
例如:如果您的程序声明了一个函数,则不提供定义&然后永远在任何地方使用/调用函数,链接器不需要嵌入代码跳转到函数的目标代码驻留在任何函数调用站点的地址。
鉴于这种情况,链接器根本不需要查找函数定义。因此代码将编译和链接。
答案 1 :(得分:3)
不要求在特定文件中实现该方法。实际上,在与库链接时,每个方法都有一个文件来减少膨胀,这被认为是一种良好的编程习惯。
这意味着给定一个定义类的头文件(并且可能没有实现),编译器只能假设所有函数都在某处实现。只有在系统试图将所有内容放在一起时(链接阶段),才会发现你指的是那些不存在的东西。
答案 2 :(得分:3)
这是防止分配或复制的常用技巧。如果您声明它但没有定义它,如果您尝试使用它会发生链接错误,即阻止人们无意中使用它
答案 3 :(得分:0)
编译器没有抱怨,因为没有语法/编译器错误。 链接器不会抱怨,因为您没有在程序中调用该函数,因此不需要链接它。