Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类中声明但未定义的方法_C++_Compilation_Linker - Fatal编程技术网

C++ 类中声明但未定义的方法

C++ 类中声明但未定义的方法,c++,compilation,linker,C++,Compilation,Linker,我有一个类,它声明了一个方法,但没有实现它。该方法不是虚拟函数。在相应的cpp文件中,我没有找到相同方法的定义。已定义类中声明的所有其他方法 我编译了代码,结果很好。我的印象是cpp必须强制声明方法的定义 如果有人能详细说明,我将不胜感激。我正在使用VS2010的cl编译器。您的代码将被编译,但它会给出链接错误 构建项目的可执行文件包括两个阶段: 汇编 连接 在编译过程中,编译器仅通过验证语言语义将源代码翻译成目标代码。 在链接过程中,链接器实际上会查找符号的定义,并从多个对象文件(在编译过

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

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


如果有人能详细说明,我将不胜感激。我正在使用VS2010的cl编译器。

您的代码将被编译,但它会给出链接错误

构建项目的可执行文件包括两个阶段:

  • 汇编
  • 连接
在编译过程中,编译器仅通过验证语言语义将源代码翻译成目标代码。
在链接过程中,链接器实际上会查找符号的定义,并从多个对象文件(在编译过程中创建)中创建一个可执行文件

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

请注意,链接器只需要链接程序使用的符号,
例如:如果您的程序声明了一个函数,没有提供任何定义,并且从不在任何地方使用/调用该函数,则链接器不需要嵌入代码,以便跳转到函数的目标代码位于任何函数调用站点的地址。

在这种情况下,链接器根本不需要查找函数定义。因此,代码将编译并链接。

不要求在特定文件中实现该方法。实际上,在与库链接时,每个方法有一个文件以减少膨胀,这被认为是(或曾经被认为是)良好的编程实践


这意味着,给定一个定义类的头文件(可能其中没有实现),编译器只能假设所有函数都在某个地方实现。只有当系统试图将所有内容组合在一起(链接阶段)时,才可以明显看出您指的是不存在的内容。

这是一种常见的防止分配或复制的技术。如果您声明了它,但没有定义它,那么如果您试图使用它,就会发生链接错误,即阻止人们无意中使用它

编译器不会抱怨,因为没有语法/编译器错误。
链接器不会抱怨,因为您没有在程序中调用该函数,因此不需要对其进行链接。

IMHO,只有在某个地方显式/隐式使用/调用缺少定义的函数时,才会发生链接错误。我没有收到任何编译或链接错误。只是补充一句,我没有在任何地方使用这个功能。代码编译并链接到.lib文件。@akrohit如上所述,如果您没有在任何地方使用该函数,则无需对其进行定义,也不会出现编译错误或链接错误。@akrohit:为了清楚起见,我更新了答案。也许我以前不够清楚,并假设了某些方面。不是真的。这使得膨胀和令人惊讶的链接问题大大减少。一些现代编译器将每个函数放在一个单独的对象节中,从而使其变得不必要,但大多数编译器都没有。我仔细检查了一遍,在任何其他文件中也找不到我上面提到的方法的定义。@RonaldMcBean-Linux和libc中(主要)就是这样做的。如果您查看源代码,您将看到每个POSIX/Linux内核函数的单独实现文件(主要是所有函数的实现文件)