【问题标题】:c++ Header Files and Implementationc++头文件和实现
【发布时间】: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.cppperson.cpp 知道在哪里可以找到函数声明,但person.h 必须在一些.cpp 文件中搜索这些实现。

现在,Visual Studio 如何跟踪这一点?每次新建一个头文件,VS是否需要解析项目中的每一个.cpp文件才能找到声明的实现位置?头文件没有任何声明要搜索哪些.cpp 文件,但它会找到它们! Visual Studio 是否正在扫描项目中的每个 .cpp 文件?

那么,在一个包含数百或数千个.cpp 文件的大型项目中会发生什么?这似乎不是很有效,所以我认为 VS 必须以不同的方式来做。你知道怎么做吗?

PS:不是关于编译器/链接器进程,而是 VS IDE 如何工作(甚至在编译或链接最终 exe 之前)

【问题讨论】:

  • person.h 不搜索任何内容,它只包含声明,main.cppperson.cpp 中的代码使用这些声明。 编译器 只是简单地记下它看到的声明,并在编译每个.cpp 文件时在需要的地方使用它们。生成的.obj 文件包含机器代码,其中包含对所使用的任何外部函数和类方法的未解析引用。编译完成后,链接器然后将所有内容放在一起,匹配对适当.obj文件的引用,以便在最终的可执行文件中填写引用。
  • 我对 VS 如何处理这种解析更感兴趣,甚至在使用编译器和链接器之前
  • 你指的是什么解析?只有预处理器、编译器和链接器阶段。该项目告诉预处理器和编译器要处理哪些.cpp 文件,并告诉链接器要链接哪些.obj 文件。就这样。每当处理#include 语句时,预处理器 都会处理.h 文件,然后编译器 处理来自预处理器的代码> 将#include 语句替换为.h 文件的实际内容。
  • 当您编辑 cpp 文件和头文件时,如果您在未编译项目/文件的情况下遗漏了任何声明的实现,或者您遗漏了一些签名、变量等,IDE 会提醒您。 .
  • 我没有用VS,所以不知道你指的是什么功能。但是 IDE 有一个内置的精简编译器在您编写代码时解析代码、查找错误、调用自动完成等的情况并不少见。

标签: c++ visual-studio-2015


【解决方案1】:

Intellisense 是将定义链接到声明的 Visual Studio 功能的名称;在键入标识符时列出完成;并在错误下绘制红色波浪线。

Intellisense 的工作原理是不断扫描解决方案中的每个源文件,包括您键入时的新定义。源代码中所有结构的记录都存储在数据库中,该数据库位于磁盘上的"solution_name.VC.db" 文件中。添加新定义或声明时,无论是添加到头文件还是源文件,Intellisense 都无需花费很长时间在数据库中查找任何相关项。

如果您删除 .VC.db 文件,然后打开解决方案,Intellisense 需要很长时间才能重新扫描所有内容,然后才能开始正常工作。 IDE 还会在状态栏中告诉您它正在“解析”文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2012-03-02
    • 2020-05-17
    相关资源
    最近更新 更多