[c++] 포함 할 헤더 파일을 결정하는 방법은 무엇입니까?

아래 (매우 간단한) 코드가 있다고 가정 해보십시오.

#include <iostream>
int main() {
    std::cout << std::stoi("12");
}

이것은 g ++와 clang에서 잘 컴파일됩니다. 그러나 다음 오류와 함께 MSVC에서 컴파일에 실패합니다.

오류 C2039 : ‘stoi’: ‘std’의 구성원이 아닙니다

오류 C3861 : ‘stoi’: 식별자를 찾을 수 없습니다

나는 그것이 헤더의 std::stoi일부 라는 것을 알고 있습니다. <string>아마도 이전의 두 컴파일러는 일부로 포함 <iostream>하고 후자는 그렇지 않습니다. C ++ 표준에 따르면 [res.on.headers]

C ++ 헤더에는 다른 C ++ 헤더가 포함될 수 있습니다.

나에게 기본적으로 세 컴파일러가 모두 정확하다고 말합니다.

이 문제는 내 학생 중 한 명이 작업을 제출했을 때 발생했으며 TA는 컴파일하지 않은 것으로 표시되었습니다. 나는 물론 그것을 고쳤다. 그러나 이와 같은 미래의 사건을 방지하고 싶습니다. 그래서 매번 검사 할 세 가지 컴파일러로 컴파일하는 것보다 포함해야 할 헤더 파일을 결정하는 방법이 있습니까?

내가 생각할 수있는 유일한 방법은 모든 std함수 호출에 대해 적절한 포함이 존재 하는지 확인하는 것입니다 . 그러나 수천 줄 길이의 기존 코드가 있으면 검색하기가 지루할 수 있습니다. 크로스 컴파일러 호환성을 보장하는 더 쉽고 나은 방법이 있습니까?

세 개의 컴파일러를 사용한 예 : https://godbolt.org/z/kJhS6U



답변

크로스 컴파일러 호환성을 보장하는 더 쉽고 나은 방법이 있습니까?

거대한 코드베이스가 있고 지금까지 이것을하지 않은 경우 이것은 항상 약간의 골칫거리가 될 것입니다.하지만 포함을 수정 한 후에는 간단한 절차를 따를 수 있습니다.

와 같은 표준 기능을 사용하는 새 코드를 작성할 때 std::stoi해당 이름을 Google에 연결하고 cppreference.com 기사로 이동 한 다음 상단을보고 정의 된 헤더를 확인하십시오.

포함되지 않은 경우 포함하십시오. 작업 완료!

( 이 표준을 사용할 수 있지만 액세스 할 수는 없습니다.)

싸고 운반 할 수없는 핵을 좋아하기 위해 모든 것을 해고하려는 유혹을받지 마십시오 <bits/stdc++.h>!


tl; dr : 문서


답변

문서를 검토하고 수동으로 (고통스럽고 시간이 많이 걸리는) 작업을 수행하는 것 외에도이를 수행 할 수있는 몇 가지 도구를 사용할 수 있습니다.

가져 오기를 구성 할 수있는 Visual Studio에서 ReSharper를 사용할 수 있습니다 (사실 ReSharper가없는 VS는 그다지 유용하지 않습니다). 포함이 없으면 추가하는 것이 좋으며, 더 이상 사용되지 않는 경우 포함이 연한 색으로 표시됩니다.

또는이 기능이있는 CLion (모든 플랫폼에서 사용 가능)을 사용할 수도 있습니다 (사실 제조 JetBrain과 동일 함).

include 사용이라는 도구도 있지만 목표는 앞으로 선언의 이점을 취하는 것입니다. 개인적으로는 팀 동료가 프로젝트를 수행하지 않았습니다.


답변