Visual Studio에서 C/C++ 포함 정리
Visual Studio 17.8 미리 보기 1부터 Visual Studio는 다음과 같은 방법으로 코드의 품질을 향상시키는 정리 기능을 제공합니다 #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
표시하여 빠른 작업 메뉴를 표시합니다. 전구를 클릭하거나 잠재적 수정 링크 표시를 선택하여 사용하지 않는 파일과 관련된 작업을 확인합니다.
전이적으로 사용되는 헤더 추가
사용하지 않는 헤더 파일을 제거하도록 선택할 수 있지만, 이 경우 코드 <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++>코드 정리). 또한 사용되지 않는 제거 포함 제안 수준을 제안으로 설정합니다. 다음 작업:
- 오류 목록에서 필터가 빌드 + IntelliSense로 설정되어 있는지 확인합니다.
- "#include x의 콘텐츠가 이 파일에 사용되고 전이적으로 포함됨"의 인스턴스를 찾습니다.
- 커서를 제안과 함께 줄 위로 마우스를 가져다 놓습니다. 전구 드롭다운에서 전이적으로 사용되는 모든 포함 항목 추가를 선택합니다.
- 전이적 포함과 관련된 모든 제안 사항이 해결될 때까지 프로젝트에서 이러한 단계를 반복합니다.
- 사용되지 않는 포함 항목 제거: 오류 목록에서 "이 파일에서 #include x가 사용되지 않음"의 인스턴스를 찾습니다.
- 사용하지 않는 헤더 위에 커서를 놓습니다. 전구 드롭다운에서 사용되지 않는 모든 포함 항목 제거를 선택합니다.
- 모든 정리 포함 제안이 해결될 때까지 프로젝트에서 이러한 단계를 반복합니다.
이 간략한 개요에서는 Include Cleanup을 통해 사용하지 않는 헤더를 제거하고 간접적으로 포함된 헤더를 추가하는 방법을 살펴보았습니다. 이렇게 하면 코드를 정리하고, 잠재적으로 더 빠르게 빌드하고, 코드의 취약성을 줄일 수 있습니다.