2016-07-17 2 views
4

나는 온라인 코딩 콘테스트를하고 있었고 나의 아이디어는 <iostream>보다 짧은 이름을 가지고 있지만 <iostream>을 포함하는 헤더를 찾는 것이었다. 글쎄, 지금까지는 성공하지 못했지만, 궁금해하게 만들었습니다 :표준은 다른 헤더를 포함하는 헤더를 지정합니까?

표준은 다른 헤더를 포함하는 헤더를 지정합니까? 예를 들어

<iostream>cplusplus 상태 :

이 헤더를 포함는 <ios>, <streambuf>, <istream>, <ostream> 및/또는 <iosfwd> 다른 헤더를 자동으로 포함 할 수있다.

그러나 <ios>을 찾을 때 "이 헤더는 <iostream>에 포함될 수 있습니다."와 같은 문구가 없습니다. 일부 헤더의 경우 제대로 작동하려면 다른 헤더를 포함해야한다고 생각할 수 있습니다. 이 경우 표준에서 헤더가 서로 의존하는 방식을 일부 선언 할 것으로 기대합니다 (예 : 순환 의존성을 피할 필요가 있음). 아니면 표준은 그러한 종속성이 존재하지 않고 구현에 달려 있는지 확인합니다.

+2

좋은 정보 또는 동료 검토 정보를 얻기 위해'cplusplus'로 가지 마라. – PaulMcKenzie

+0

@PaulMcKenzie 더 나은 출처는 무엇입니까? 내가 주제에서 벗어날 것이기 때문에 나는 질문에서 묻지 않았다. ... – user463035818

+2

1을 위해, [this site] (http://en.cppreference.com/w/). – PaulMcKenzie

답변

2

까지 표준에서는 다른 헤더를 포함하는 헤더를 지정하지 않습니다. 구현이 정의한 것이며 사용자가 신뢰할 수있는 것이 아닙니다. 당신이 사용하는 것을 포함하십시오.

http://cplusplus.com/보다 훨씬 높은 품질 인 http://cppreference.com/을 선호 할 수도 있습니다.

+0

cppref에 "포함 할 것"대신 "inlcudes"라고 쓰여 있는데 이는 모든 구현에 나열된 헤더가 포함되어야 함을 암시하지 않습니까? – user463035818

+0

@ tobi303 오른쪽이지만 "foo"에 "bar" 표준 텍스트에서 보증합니다. 가능하면 정보를 공유하십시오. –

1

일반적으로 표준에서는 헤더가 다른 헤더를 포함해야한다는 것을 지정하지 않습니다. 필요에 따라 다른 헤더에서 이름을 가져 오는 것을 관리하는 것은 구현에 달려 있으며 표준 헤더에는 다른 표준 헤더를 포함 할 수 있습니다.

한 가지 예외는 헤더 <initializer_list>입니다. 초기화 프로그램 목록 (예 : 컨테이너)을 사용하는 헤더는 해당 헤더를 포함해야합니다.

2

다른 헤더가 포함 할 수있는 헤더에 대한 일반적인 규칙은 다음과 같습니다. 자동으로 포함되도록 지정된 몇 가지 헤더가 있으며 그 외의 경우 구현에 따라 다르고 문서화 할 필요가 없습니다.

17.6.5.1 준거 구현

17.6.5.2은 헤더 [res.on.headers]

1 A C++ 헤더가 다른 C++ 헤더를 포함 할 수 준거]. C++ 헤더는 그 개요에 나타나는 선언과 정의를 제공해야한다. 개요에 다른 C++ 헤더를 포함하는 것으로 표시된 C++ 헤더는 다른 헤더의 개요에 나타나는 선언과 정의를 제공해야합니다.

  • <utility>, <string>, <array>, <deque>, <forward_list>, <list>, <vector>, <map>, <set>, <unordered_map>, <unordered_set> "다른 C++ 헤더를 포함하는 것으로 그 개요에 도시 된", 규칙

가 적용 , <queue>, <stack>, <algorithm>, <random>, <valarray>, <regex><initializer_list>.

  • <bitset><string>, <iosfwd>을 포함한다.
  • <iostream><ios>, <streambuf>, <istream>, <ostream>을 포함한다.
  • <ios><iosfwd>을 포함합니다.
  • 그러나, <ios><iosfwd>을 포함하는 것으로 표시되어 있지만 실제로 구현하지 않고도 요구 사항을 충족 할 수 있으며, [res.on.headers]별로 잘 수행 할 수 있습니다. 대부분의 경우 선언 된 함수 및 유형에 액세스 할 수있는 한 구현에 다른 헤더가 포함되는지 여부에는 차이가 없습니다.

    1

    표준 크기의이 참조하는 에 따라 달라집니다. C++ 98 및 C++ 03에서는 다른 헤더를 포함하여 헤더에 대한 요구 사항이 없습니다.

    C++ 11 또는 C++ 14로 시작하는 표준 에서 특정 헤더에 다른 헤더가 포함되도록 지정합니다.

    모든 표준 버전에서는 동일한 헤더를 여러 번 포함하는 것이 안전해야합니다.

    따라서 특정 헤더가 필요하고 이전 표준을 구현하는 컴파일러에서 작업하는 중이라면 # 헤더 만 포함하면됩니다.