1

我有“Hello World”代码,它使用来自另一个具有它的标题的 hi.cpp 文件中的函数 fhi。

如果我的理解有误,请根据以下内容纠正我:

我可以包含 cpp 文件, #include "c:\c\hi.cpp"而不是使用 header 没有任何问题,除了它在头文件中看起来更具可读性。

如果我在我的主程序中包含像示例这样的标题hi.h,则必须hi.h包含hi.cpp,否则它会根据相同的文件名自动完成hi。我想知道编译器如何知道函数fhi体在哪里。

头文件和cpp文件可以有不同的名称吗?

程序:

#include "stdafx.h"
#include "c:\c\hi.h"


int _tmain(int argc, _TCHAR* argv[])
{
fhi(1);
return 0;
}

嗨.h

 #include <cstdlib>
 #include <iostream>

 int var;
 int  fhi(int f);

嗨.cpp

 #include <cstdlib>
 #include <iostream>

 int  fhi(int f)
 {
 return 0;
 }
4

5 回答 5

2

hi.h 必须包含 hi.cpp

No.hi.h仅包含声明,其他 .cpp 文件可以是其他声明。

我想知道编译器如何知道函数 fhi 主体在哪里。

它没有。您需要将所有 *.cpp 文件编译成目标文件。在您的情况下,您将有两个目标文件:program.ohi.o. 链接器现在可以获取这两个目标文件,并输出可执行文件。对其他函数的引用(在这种情况下是 fhi(..) 的实际定义)在此阶段解决。

另外,为什么在#includes 中使用绝对路径?当您移动“c”目录时它会中断。

于 2012-08-08T10:32:46.107 回答
2

通常发生的是构建系统将.cpp文件编译成目标文件,然后用于构建主可执行文件。将这一点告诉构建系统的方法差异很大。

重要的一点是您hi.cpp 必须包括hi.h. 您还应该在 中放置一个包含保护hi.h,以确保在翻译单元中多次包含它是安全的。

于 2012-08-08T10:33:42.657 回答
2

我可以包含像 #include "c:\c\hi.cpp" 这样的 cpp 文件,而不是使用 header 没有任何问题,除了它在头文件中看起来更具可读性。

是的,您可以这样做,但不建议这样做,问题之一是封装;你没有隐藏实现细节。您提到的可读性也是一个问题,标题更容易阅读,因为它清楚地显示了哪些方法是公共的。

如果我在我的主程序 hi.h 中包含像 sample 这样的标题,hi.h 必须包含 hi.cpp,否则它会根据相同的文件名 hi 自动完成。我想知道编译器如何知道函数 fhi 主体在哪里。

标头需要显式包含在 hi.cpp 和任何使用标头中定义的类的 .cpp 文件中。

头文件和cpp文件可以有不同的名称吗?

是的,但不建议这样做,这会使找到东西变得更加困难。

作为一般规则:想想其他程序员可能想要查看您的代码,因此您需要对其进行结构化,使其易于阅读和理解,并让您在 2 年后更容易记住事情在哪里.

于 2012-08-08T10:34:38.770 回答
2

在 Visual Studio 中,项目中包含的所有 CPP 文件都将被编译以生成 OBJ 文件。这些 OBJ 文件将链接在一起形成 EXE 或 DLL。

包含文件类似于将文件的内容粘贴到该位置。唯一的区别是这种粘贴是由预编译器在编译期间完成的。

如果函数是内联的,则由编译器或在创建最终二进制文件时由链接器完成查找函数体所在的位置。

于 2012-08-08T10:35:02.230 回答
2

首先,如果头文件与包含它的源文件位于同一目录中,则可以使用 just

#include "hi.h"

换句话说,您不必使用完整路径。(参见例如包含"stdafx.h"。)

其次,在您的头文件中,您不需要包含其他头文件,除非您需要这些头文件中的类型。在您的头文件中,您包含的头文件中没有任何需要的东西。

第三,你应该保护头文件头文件不被多次包含在同一个源文件中,这可以通过所谓的 include guard来完成,在某些编译器中通过一个名为#pragma once.

第四,在你的头文件中定义一个全局变量var。然后将在包含头文件的每个源文件中定义此变量,这将导致错误。您需要将变量声明为extern

extern int var;

然后在一个源文件中定义变量,就像现在一样。

第五,你不应该在头文件中包含源文件(有一些你不必考虑的特殊例外)。相反,您将所有源文件添加到项目中(我假设您在 MS VisualStudio 中),它们将全部自动构建并链接在一起。

第六,既然您似乎在使用 VisualC++,那么您可能正在使用一种叫做precompiled headers的东西。这是编译器用来加速编译的东西。但是,要使其工作,您必须包含"stdafx.h"在所有源文件中。该包含实际上必须是每个源文件中的第一个非注释行。

于 2012-08-08T10:37:42.283 回答