这是我知识中一个令人讨厌的漏洞,我似乎找不到答案。
我理解为什么它在编译期间工作(头从来没有单独编译过,所以stdafx.h已经包含在内(,但不理解为什么它能在编辑时工作。
假设我有以下文件:
stdafx.h
#pragma once
#include <string>
MyFunction.h
#pragma once
void MyFunction( std::string Text );
MyFunction.cpp
#include "stdafx.h"
#include "MyFunction.h"
void MyFunction( std::string Text )
{
// implementation here
}
当我编辑MyFunction.h时,Intellisense如何找到std::string
以实现自动完成,而不是将其显示为未定义,等等?
我问这个问题部分是出于好奇,部分是因为如果我不知道这个机制,那么我就不知道我是否有破坏它的风险,也不知道当我知道的时候如何修复它。我已经看到它破坏了很多次,导致大部分有问题的标题都被标记为错误,然后在某个时候,它要么只是自我修复,要么我接受它不会回来,并在标题中添加一些额外的战略包含。
重复一遍:我不是问在编译过程中如何找到std::string,而是问在编辑头文件时如何找到它。
VS Intellisense在编辑时如何从stdafx.h中查找定义头文件?
在不同版本的VS(VS2012~VS2019(中进行了一些测试后,我认为您所经历的是关于VS intellisense的预期行为。
要回答您最初的问题How does VS Intellisense find...
:
在MyFunction.h
中编辑时,我认为Intellisense通过读取MyFunction.cpp
文件中的数据或信息(#include statements
(来找到stdafx.h
中的定义。
也就是说:当我在当前项目中有a.h, b.h and b.cpp
时,如果b.cpp
有语句#include "a.h"
和#include "b.h"
,那么Intellisense会搜索这三个文件中的定义。因此,即使您将#include <string>
从stdafx.h
移动到MyFunction.cpp
文件,MyFunction.h
也可以识别这些定义。
因此,如果一个test.chp文件引用(包含(了一个test.h,并且这个test.cpp文件还使用#include
来引用(包括(test2.h、test3.h…在编辑test.h
时,Intellisense将自动搜索test.cpp、test2.h和test3.h中的定义…在我看来,VS Intellisense在这种情况下就是这样工作的。(在我的机器中,VS2012、VS2015、VS2017、VS2019的行为相同(
希望这有助于解决你的困惑,如果我误解了什么,请随时纠正我:(