【发布时间】:2018-04-20 10:50:09
【问题描述】:
我试图了解 IDE(我正在使用 Visual Studio)如何知道在哪里可以找到头文件声明的实现。
假设我有 2 个 cpp 文件和 1 个头文件:
-
main.cpp,包含main()函数并包含person.h -
person.h,包含一些在person.cpp中实现的类声明 -
person.cpp,包含了person.h声明的实现,也定义了person.h
所以我的理解是main.cpp 和person.cpp 知道在哪里可以找到函数声明,但person.h 必须在一些.cpp 文件中搜索这些实现。
现在,Visual Studio 如何跟踪这一点?每次新建一个头文件,VS是否需要解析项目中的每一个.cpp文件才能找到声明的实现位置?头文件没有任何声明要搜索哪些.cpp 文件,但它会找到它们! Visual Studio 是否正在扫描项目中的每个 .cpp 文件?
那么,在一个包含数百或数千个.cpp 文件的大型项目中会发生什么?这似乎不是很有效,所以我认为 VS 必须以不同的方式来做。你知道怎么做吗?
PS:不是关于编译器/链接器进程,而是 VS IDE 如何工作(甚至在编译或链接最终 exe 之前)
【问题讨论】:
-
person.h不搜索任何内容,它只包含声明,main.cpp和person.cpp中的代码使用这些声明。 编译器 只是简单地记下它看到的声明,并在编译每个.cpp文件时在需要的地方使用它们。生成的.obj文件包含机器代码,其中包含对所使用的任何外部函数和类方法的未解析引用。编译完成后,链接器然后将所有内容放在一起,匹配对适当.obj文件的引用,以便在最终的可执行文件中填写引用。 -
我对 VS 如何处理这种解析更感兴趣,甚至在使用编译器和链接器之前
-
你指的是什么解析?只有预处理器、编译器和链接器阶段。该项目告诉预处理器和编译器要处理哪些
.cpp文件,并告诉链接器要链接哪些.obj文件。就这样。每当处理#include语句时,预处理器 都会处理.h文件,然后编译器 处理来自预处理器的代码> 将#include语句替换为.h文件的实际内容。 -
当您编辑 cpp 文件和头文件时,如果您在未编译项目/文件的情况下遗漏了任何声明的实现,或者您遗漏了一些签名、变量等,IDE 会提醒您。 .
-
我没有用VS,所以不知道你指的是什么功能。但是 IDE 有一个内置的精简编译器在您编写代码时解析代码、查找错误、调用自动完成等的情况并不少见。