Share via


Visual Studio에서 C/C++ 포함 정리

Visual Studio 17.8 미리 보기 1부터 Visual Studio는 다음과 같은 방법으로 코드의 품질을 향상시키는 클린up 기능을 제공합니다 #include .

  • 필요한 헤더 파일이 다른 헤더 파일에 의해 간접적으로 포함되어 있기 때문에 컴파일하는 코드에 대한 헤더 파일을 추가할 수 있습니다.
  • 사용되지 않는 헤더 파일을 제거하여 빌드 시간 및 코드 클린 줄 향상을 제공합니다.

포함 정리는 기본적으로 설정됩니다. 구성하는 방법을 알아보려면 Visual Studio에서 Config C/C++ Include Cleanup을 참조하세요.

직접 및 간접 헤더

먼저 몇 가지 용어:

  • 직접 헤더는 코드에서 명시적으로 사용하는 헤더입니다 #include .
  • 간접 헤더는 명시적으로 하지 않는 헤더입니다 #include. 대신 직접 포함하는 헤더 파일이 포함됩니다. 또한 간접 헤더가 포함되어 transitively있다고 말합니다.

Include Cleanup은 코드를 분석하고 사용되지 않는 헤더와 간접적으로 포함되는 헤더를 결정합니다. 다음 헤더 파일을 고려합니다.

// 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<iostream>에는 간접 헤더가 포함 <string> 됩니다.

문제는 myProgram.cpp 이를 사용 std::string 하지만 std::cout이를 정의하는 헤더를 직접 포함하지는 않는다는 것입니다. 이 코드는 이러한 헤더를 포함하기 때문에 myHeader.h 컴파일됩니다. 두 코드 중 하나를 myProgram.cpp 포함하여 중지된 경우 myHeader.h 더 이상 컴파일되지 않으므로 이 코드는 취약합니다.

C++ 지침에 따라 코드에 헤더 파일 변경으로 인한 취약성이 발생하지 않도록 모든 종속성에 대한 헤더를 명시적으로 포함하는 것이 좋습니다. 자세한 내용은 C++ 핵심 지침 SF.10을 참조하세요.

Include Cleanup은 코드를 분석하여 사용되지 않고 간접적으로 포함된 헤더를 식별합니다. Visual Studio의 C++ #include 도구 구성에 설명된 설정을 기반으로 피드백을 제공합니다. 피드백은 오류 목록 경고, 제안 등의 형식일 수 있습니다. 정리 포함에서 제공하는 피드백에 대한 자세한 내용은 정리 메시지 포함을 참조 하세요.

사용되지 않는 헤더

코드가 발전함에 따라 일부 헤더 파일이 더 이상 필요하지 않을 수 있습니다. 복잡한 프로젝트에서 추적하기는 어렵습니다. 시간이 지남에 따라 컴파일러가 불필요한 헤더 파일을 처리하므로 빌드가 더 오래 걸릴 수 있습니다. 정리 포함은 사용되지 않는 헤더를 찾아서 제거하는 데 도움이 됩니다. 예를 들어 다음에서 주석 처리되는 경우 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" 에서는 주석 처리되므로 사용되지 myFunc() 않으므로 흐리게 표시됩니다(Visual Studio의 C++ #include 도구 구성에 설명된 설정).

커서를 흐리게 #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::stringstd::cout 중임을 확인할 수 있습니다. 이 코드는 다른 필수 헤더를 포함하는 데 의존 myHeader.h 하지 않으므로 더 이상 취약하지 않습니다.

모범 사례

먼저 간접적으로 포함된 헤더 파일을 추가하지 않고 사용되지 않는 것으로 보이는 헤더 파일을 제거하지 마세요. 코드가 사용되지 않는 헤더 파일에 간접 포함을 사용할 수 있기 때문입니다. 먼저 전이적으로 사용되는 헤더를 추가합니다. 그런 다음 사용하지 않는 헤더를 제거하면 제거한 헤더 파일에 간접적으로 포함된 헤더 파일이 누락되어 컴파일 오류가 표시되지 않습니다.

이 작업을 수행하는 한 가지 방법은 누락된 추가 포함 제안 수준을 제안으로 설정하는 것입니다(도구>옵션>텍스트 편집기>C/C++>코드 정리). 또한 사용되지 않는 제거 포함 제안 수준을 제안으로설정합니다. 다음 작업:

  1. 오류 목록에서 필터가 빌드 + IntelliSense설정되어 있는지 확인합니다.
  2. "#include x의 콘텐츠가 이 파일에 사용되고 전이적으로 포함됨"의 인스턴스를 찾습니다.
  3. 커서를 제안과 함께 줄 위로 마우스를 가져다 놓습니다. 전구 드롭다운에서 전이적으로 사용되는 모든 포함 항목 추가를 선택합니다.
  4. 전이적 포함과 관련된 모든 제안 사항이 해결될 때까지 프로젝트에서 이러한 단계를 반복합니다.
  5. 사용되지 않는 포함 항목 제거: 오류 목록에서 "이 파일에서 #include x가 사용되지 않음"의 인스턴스를 찾습니다.
  6. 사용하지 않는 헤더 위에 커서를 놓습니다. 전구 드롭다운에서 사용되지 않는 모든 포함 항목 제거를 선택합니다.
  7. 모든 정리 포함 제안이 해결될 때까지 프로젝트에서 이러한 단계를 반복합니다.

이 간략한 개요에서는 Include Cleanup을 통해 사용하지 않는 헤더를 제거하고 간접적으로 포함된 헤더를 추가하는 방법을 살펴보았습니다. 이렇게 하면 코드 클린 유지하고, 잠재적으로 더 빠르게 빌드하고, 코드의 취약성을 줄일 수 있습니다.

참고 항목

Visual Studio에서 C/C++ 정리 포함 구성
정리 메시지 포함