아래 (매우 간단한) 코드가 있다고 가정 해보십시오.
#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, 즉시 #include <string>존재 하는지 확인하십시오 .
std::stoi처리를위한 문자열을 당신은 추측 할 수<string>포함하는 멋진 헤딩슛이 될 것입니다. 또는 당신 에게 좋은 참조 를 검색 할 수 있습니다. 또한 항상 명시 적으로 헤더 파일을 포함하는 것이 좋습니다. 따라서 이식 불가능한 구현 특정 동작에 의존 할 필요가 없습니다.