Очистка C/C++ включается в Visual Studio

Начиная с Visual Studio 17.8 (предварительная версия 1), Visual Studio предоставляет #include функцию очистки, которая улучшает качество кода следующим образом:

  • Предлагает добавлять файлы заголовков для кода, который компилируется только потому, что необходимый файл заголовка включается косвенно другим файлом заголовка.
  • Предлагает удалить неиспользуемые файлы заголовков, повышая время сборки и чистоту кода.

Включение очистки по умолчанию. Сведения о настройке см. в статье "Очистка включения конфигурации C/C++" в Visual Studio.

Прямые и косвенные заголовки

Сначала некоторые термины:

  • Прямой заголовок — это заголовок, который вы явно #include в коде.
  • Косвенный заголовок — это заголовок, который не выполняется #includeявно. Вместо этого файл заголовка, который вы выполняете непосредственно включить, включает его. Мы также говорим, что непрямый заголовок включен transitively.

Включить очистку анализирует код и определяет, какие заголовки не используются и которые косвенно включены. Рассмотрим следующий файл заголовка:

// myHeader.h

#include <string>
#include <iostream>

void myFunc()
{
    std::string s = "myFunc()\n";
    std::cout << s;
}

И программа, использующая ее:

// myProgram.cpp
#include "myHeader.h"

int main()
{
    std::string s = "main()"; // string is indirectly included by myHeader.h
    std::cout << s; // cout is indirectly included by myHeader.h
    myFunc();
}

myHeader.h является прямым заголовком, так как myProgram.cpp явно включает его. myHeader.h включает <string> и <iostream>, поэтому это косвенные заголовки.

Проблема заключается в том, что myProgram.cpp использует std::string и std::coutне включает непосредственно заголовки, определяющие их. Этот код компилируется, так как myHeader.h включает эти заголовки. Этот код является хрупким, так как если myHeader.h когда-либо остановлен, включая один из них, myProgram.cpp больше не компилируется.

В соответствии с рекомендациями C++ лучше явно включать заголовки для всех зависимостей, чтобы код не подвергался хрупкости, вызванной изменениями файлов заголовков. Дополнительные сведения см. в статье "Основные рекомендации по C++ SF.10".

Включить очистку анализирует код, чтобы определить неиспользуемые и косвенно включенные заголовки. Он предоставляет отзывы на основе параметров, описанных в разделе "Настройка средства #include C++ в Visual Studio". Отзывы могут быть в виде предупреждений списка ошибок, предложений и т. д. Дополнительные сведения об отзыве, предоставленном службой "Очистка включения", см. в разделе "Включить сообщения очистки".

Неиспользуемые заголовки

По мере развития кода вам больше не потребуется некоторые файлы заголовков. Это трудно отслеживать в сложном проекте. Со временем сборки могут занять больше времени, так как компилятор обрабатывает ненужные файлы заголовков. Включение очистки помогает находить и удалять неиспользуемые заголовки. Например, что делать, если myFunc() вы закомментированы в myProgram.cpp:

// myProgram.cpp
#include "myHeader.h"

int main()
{
    std::string s = "main()"; // string is indirectly included from myHeader.h
    std::cout << s; // cout is indirectly included from myHeader.h
    // myFunc(); // directly included from myHeader.h
}

На следующем снимке экрана неактивен (параметр, #include "myHeader.h" описанный в разделе "Настройка средства #include C++ в Visual Studio"), так как он не используется, так как он не используется, так как myFunc() закомментирован.

Наведите указатель мыши на неактивный, #include чтобы открыть меню быстрого действия. Щелкните лампочку (или выберите ссылку "Показать потенциальные исправления"), чтобы просмотреть действия, связанные с неиспользуемым файлом:

Three refactoring options are shown: Remove # include myHeader.h, remove all unused includes, and Add all transitively used and remove all unused # includes.

Добавление транзитивно используемых заголовков

Мы могли бы удалить неиспользуемый файл заголовка, но это нарушает код, так как <string> и <iostream> косвенно включается через myheader.h.

Вместо этого можно выбрать команду "Добавить все транзитивно используемые" и удалить все неиспользуемые #includes. Это удаляет неиспользуемый заголовок myHeader.h, но также добавляет все используемые заголовки, которые косвенно включаются через myHeader.h. Результатом в данном случае является добавление #include <string> и #include <iostream>myProgram.cppудаление #include "myHeader.h":

// myProgram.cpp
#include <iostream>
#include <string>

int main()
{
    std::string s = "main()"; // string is directly included from <string>
    std::cout << s; // cout is directly included from <string>
    // MyFunc();
}

Средство не обновляет комментарии, но вы можете увидеть, что код теперь используется std::string и std::cout напрямую. Этот код больше не является хрупким, так как он не зависит от myHeader.h включения других обязательных заголовков.

Рекомендация

Не удаляйте неиспользуемые файлы заголовков, не добавляя косвенно включенные файлы заголовков. Это связано с тем, что код может полагаться на косвенное включение в файл заголовка, который в противном случае не используется. Сначала добавьте транзитивные используемые заголовки. Затем при удалении неиспользуемых заголовков ошибки компиляции не возникают из-за отсутствующих файлов заголовков, включенных косвенно в удаленный файл заголовка.

Один из способов сделать это — задать параметр "Очистка включения" для добавления отсутствующих элементов включает уровень предложения в предложение (текстовый редактор>инструментов>>C/C++>Code Cleanup). Кроме того, параметр Remove unused включает уровень предложения в предложение. Затем:

  1. В списке ошибок убедитесь, что для фильтра задано значение Build + IntelliSense.
  2. Найдите экземпляры "Содержимое из #include x используется в этом файле и транзитивно включены".
  3. Наведите указатель мыши на строку с предложением. В раскрывающемся списке лампочки выберите "Добавить все транзитивно использованные" элементы.
  4. Повторите эти действия в проекте, пока не будут устранены все предложения по транзитивному включению.
  5. Удаление неиспользуемых включает: в списке ошибок найдите экземпляр "#include x не используется в этом файле".
  6. Наведите указатель мыши на неиспользуемый заголовок. В раскрывающемся списке лампочки выберите " Удалить все неиспользуемые" элементы.
  7. Повторите эти действия в проекте, пока не будут устранены все предложения по очистке.

В этом кратком обзоре вы узнали, как включить очистку позволяет удалять неиспользуемые заголовки и добавлять заголовки, которые были косвенно включены. Это помогает обеспечить очистку кода, возможно, ускорить сборку и снизить хрупкость кода.

См. также

Настройка очистки включения C/C++ в Visual Studio
Включение сообщений очистки