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


13

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

#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


6
당신이 기억하는 경우 std::stoi처리를위한 문자열을 당신은 추측 할 수 <string>포함하는 멋진 헤딩슛이 될 것입니다. 또는 당신 에게 좋은 참조 를 검색 할 수 있습니다. 또한 항상 명시 적으로 헤더 파일을 포함하는 것이 좋습니다. 따라서 이식 불가능한 구현 특정 동작에 의존 할 필요가 없습니다.
일부 프로그래머 친구

3
가장 좋은 방법은 다른 플랫폼으로 가기 전에 cppreference 로 이동하는 것입니다. 그들은 거기에 꽤 자세한 내용을 가지고 있습니다.
Siddharth

1
코드를 작성하는 순간 적절한 헤더를 포함 시키십시오. 즉. 를 포함하는 코드를 작성하는 순간 std::stoi, 즉시 #include <string>존재 하는지 확인하십시오 .
Sander De Dycker

3
일반적인 경우 이것은 어려운 문제 입니다. 그러나 누락 된 표준 라이브러리 포함에 대해 이야기 할 때 실제로 사용되는 모든 함수 호출 / 유형을 검사하는 것이 일반적인 방법입니다.
Max Langhof

1
@ skratchi.at, 학생들은 코드가 표준을 준수하는 한 원하는 컴파일러를 사용할 수 있다고합니다. 4 년 후, 이것이 처음으로 문제가되었습니다.
ChrisMM

답변:


14

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

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

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

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

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

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


tl; dr : 문서


3
공평하게 말하면, 일단 당신이 그것들을 모두 효과적으로 기억하고 더 이상 그것을 찾을 필요가 없다면, 그것은 꽤 매끄럽게 느껴집니다
Lightness Races in Orbit

5
@JosephWood : 주어진 함수가 기계적으로되는 헤더를 알 수없는 경우, 기회는 당신이 해야 하는 기능을 조회 한 번 확인 그래서도 추가하지 않습니다 속한 헤더되는 찾는, 어쨌든에 당신의 가정을 시각.
DevSolar

1
@JosephWood처럼, 나는 또한 더 많은 경험을 가진 사람들이 더 나은 길을 가지기를 바랐습니다. 대부분의 STL 함수에 포함 할 헤더를 알고 있지만 모든 함수를 찾는 것보다 학생들을 가르치는 더 쉬운 방법이 있기를 바랐습니다. : P
ChrisMM

1
@ChrisMM에는 include-what-you-use 와 같은 도구 가 있습니다 . 정확성을 보장 할 수는 없으며 (실제로 수동 작업이 필요한 경우도 있음) 전혀 나쁘지는 않습니다.
괴물

4
@ChrisMM 학생들에게 문서를 참조하도록 가르치는 것은 매우 중요 합니다. 수천 명의 사람들이 매일이 사이트를 통해 스트리밍해야한다는 세속적 인 아이디어가 없습니다. 설명서를 사용하는 것이 더 쉽고 좋습니다.
궤도에서 가벼움 경주

-1

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

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

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

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


clion은 작동하는 경우 다른 헤더가 이미 포함 된 경우 올바른 헤더를 자동으로 포함하지 않습니다 (예 : iostream이 이미 포함 된 경우 여기에서 문자열을 제안하지 않음) IIRC
RiaD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.