Как VS Intellisense находит определения из stdafx.h при редактировании файла заголовка? - PullRequest
0 голосов
/ 04 ноября 2019

Это досадная дыра в моих знаниях, и я не могу найти ответ.

Я понимаю, почему это работает во время компиляции (заголовок никогда не компилируется изолированно, поэтому 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 находится во время компиляции, я спрашиваю, как он обнаруживается при редактировании файла заголовка.

1 Ответ

1 голос
/ 08 ноября 2019

Как VS Intellisense находит определения из stdafx.h при редактировании файла заголовка?

После некоторых испытаний в разных версиях VS (VS2012 ~ VS2019), я думаю, что вы испыталиэто ожидаемое поведение в отношении VS intellisense.

Чтобы ответить на исходный вопрос How does VS Intellisense find...:

При редактировании в MyFunction.h, я думаю, что Intellisense найдет определения в stdafx.h, прочитав данные илиинформация (#include statements) в файле MyFunction.cpp.

То есть: если у меня есть 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.h ссылается (включается) один test.cppфайл, и этот файл test.cpp также использует #include для ссылки (включают) test2.h, test3.h ... При редактировании test.h Intellisense автоматически выполнит поиск определений в test.cpp, test2.h, test3. h ... По-моему, так работает VS Intellisense в этом сценарии. (Такое же поведение в VS2012, VS2015, VS2017, VS2019 на моей машине)

Надеюсь, это поможет решить вашу загадку, и если я что-то неправильно пойму, пожалуйста, не стесняйтесь исправлять меня:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...