处理包含和使用标头
dealing with includes and using headers
我有"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.o
和 hi.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"
。该包含实际上必须是每个源文件中的第一个非注释行。
- 如何使用cppcheck处理半相对包含路径
- 如何处理包含空格的 cin 的用户输入?
- 使用预处理指令检查是否包含标头?
- 分析包含处理指令的 XML
- 将C++预处理器处理我当前 h 文件中包含的 h 文件的内容
- QT创建者错误地处理标头文件包含来自Directory
- RCPP:处理包含列表的列表
- 将队列处理为包含文件的文件夹.可能存在的问题
- Asio在包含处理程序的类被破坏后调用处理程序
- STL 是否包含处理数组的迭代器
- 处理包含和使用标头
- 有没有一种方法可以使用引用而不是指针来处理相互包含数据的类
- 将项pushing_back到矢量中包含的矢量时未处理的异常
- C++类包含异常处理
- 如何处理错误“vtkTrivialProducer :此数据对象不包含请求的范围”
- 如何在c++中处理包含列表的嵌套数据结构
- JVM 无法按预期方式处理包含名为 "Node" 的类的 JNI C++代码
- 如何在OpenGL中处理包含多个对象的动画
- 成功包含文件,现在处理语义问题
- 当一行只包含制表符时,处理制表符描绘的文本文件