处理包含和使用标头

dealing with includes and using headers

本文关键字:包含 处理      更新时间:2023-10-16

我有"Hello World"代码,它使用来自另一个带有标头的hi.cpp文件中的函数fhi。

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

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

如果我在我的主程序hi.h中包含类似示例的标头,则必须hi.h包含hi.cpp,或者根据相同的文件名hi自动完成。我想知道编译器如何知道函数fhi体在哪里。

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

程序:

#include "stdafx.h"
#include "c:chi.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;
 }

HI.H必须包括HI吗.cpp

不。 hi.h仅包含声明,这些声明可以由其他.cpp文件组成。

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

其实不然。您需要将所有 *.cpp 文件编译到目标文件中。在您的情况下,您将有两个目标文件:program.ohi.o 。链接器现在可以获取这两个对象文件,并吐出可执行文件。对其他函数的引用(在本例中为 fhi(..)) 的实际定义)在此阶段得到解决。

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

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

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

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

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

如果我在我的主程序中包含类似示例的标题 hi.h,必须 hi.h 包括 hi.cpp,或者根据同一文件自动完成 名字嗨。我想知道编译器如何知道函数 fhi 体在哪里。

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

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

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

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

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

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

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

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

#include "hi.h"

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

其次,在头文件中,

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

第三,您应该保护头文件头文件不被多次包含在同一个源文件中,这可以通过所谓的包含保护来完成,通过一个名为 #pragma once 的特殊指令在某些编译器中打开。

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

extern int var;

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

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

第六,由于您似乎正在使用 VisualC++,那么您可能正在使用称为预编译标头的东西。这是编译器用来加速编译的东西。但是,要使其正常工作,您必须在所有源文件中包含"stdafx.h"。该包含实际上必须是每个源文件中的第一个非注释行。