<cstdint> 대 <stdint.h>


95

stdint.h과 의 차이점은 무엇입니까 cstdint?

둘 다 MSVC (Visual Studio 2010) 및 gcc-4.5.1에서 사용할 수 있습니다. 또한 둘 다 intX_t/ uintX_t유형을 정의합니다 (여기서는 유형의 X바이트 크기).

  • 두 헤더의 근거가 같으면 (이동 가능한 유형) 둘 중 하나를 결정하기 위해 어떤 결정을 내려야합니까?

stdint.h어떤 네임 스페이스는하지 않고 각 유형을 정의 cstdint의 유형 거짓말 std네임 스페이스.

  • 정의 된 유형을 std네임 스페이스 에 포함하거나 포함하지 않을 이유가 있습니까? 두 헤더의 차이점은 무엇입니까?

cstdint파일 확장자가없고 c접두사를 stdint.h사용하고 .h확장자를 사용합니다 .

  • 이 헤더의 명명 규칙은 무엇입니까? c접두사 이것은 C 라이브러리 있음을 나타냅니다? 파일 확장자가 부족한 이유가 cstdint있습니까?

OS X 10.8에는 <cstdint>. 수신 된 오류는 다음과 같습니다 ./misc.h:7:10: fatal error: 'cstdint' file not found..
jww

답변:


122

C ++ 98의 원래 의도 <cstdint>는 전역 네임 스페이스를 오염시키지 않기 위해 C ++에서 사용해야한다는 것이 었 <cstdint>습니다 (특히 C ++ 11에서만 추가되었지만 <c*>일반적으로 헤더).

그러나 어쨌든 심볼을 전역 네임 스페이스에 넣는 구현은 지속되었고 C ++ 11은이 관행 [*]을 승인했습니다. 따라서 기본적으로 세 가지 옵션이 있습니다.

  • 사용하는 <cstdint>각 정수 유형을 사용 하고 완전히 한정하거나 using std::int32_t;etc 로 범위로 가져옵니다 (장황하기 때문에 성가 시지만 C ++ 표준 라이브러리의 다른 기호와 마찬가지로 수행하는 올바른 방법입니다)
  • 사용 <stdint.h>( 사용 되지 않으므로 약간 나쁨)
  • 사용 <cstdint>하고 구현이 전역 네임 스페이스에 기호를 넣을 것이라고 가정합니다 (보장되지 않기 때문에 매우 나쁨).

실제로는 성가신 많은 양의 코드가 마지막 옵션을 사용한다고 생각합니다. 단순히 <cstdint>전역 네임 스페이스에 기호를 넣는 구현에서 우연히 쉽게 수행 할 수 있기 때문 입니다. 첫 번째를 사용해야합니다. 두 번째는 하나의 미덕 을 가지고 있습니다. 그것은 단지 그것을하는 것이 아니라 전역 네임 스페이스에 물건을 넣는 것이 보장 된다는 것입니다 . 특히 유용하다고 생각하지 않지만 우선 순위라면 타이핑을 절약 할 수 있습니다.

네 번째 옵션이 있으며 #include <cstdint>그 다음에 using namespace std;는 때때로 유용하지만 using namespace std;. 다른 사람들은 그 장소가 어디에 있는지 다른 생각을 가지 겠지만, "헤더 파일의 최상위 수준"은 "제한된 범위 내"보다 더 나쁜 "cpp 파일의 최상위 수준"보다 나쁩니다. 어떤 사람들은 전혀 글 using namespace std;을 쓰지 않습니다 .

[*] 즉, C ++ 표준 헤더는 전역 네임 스페이스에 항목을 넣을 수 있지만 필수는 아닙니다. 따라서 이러한 기호와 충돌하는 것을 피해야하지만 실제로 사용할 수는 없습니다. 기본적으로 C ++의 전역 네임 스페이스는 지뢰밭이므로 피하십시오. 어떤 사람은위원회가 using namespace std;헤더 파일의 최상위 수준에 고정하는 것만큼이나 해로운 구현으로 관행을 비준했다고 주장 할 수 있습니다 . 차이점은 구현은 C 표준 라이브러리의 기호에 대해서만 수행하고 using namespace std;C ++ 에서는 수행한다는 점입니다. -전용 기호도 있습니다. C 표준에는 향후 표준에 추가하기 위해 예약 된 이름을 나열하는 섹션이 있습니다. 이러한 이름을 C ++ 전역 네임 스페이스에 예약 된 것으로 취급하는 것은 완전히 어리석은 생각은 아니지만 필수는 아닙니다.


답이없는 유일한 질문은 헤더 파일의 명명 규칙에 관한 것입니다.이 주제에 대해 알고 있습니까?
PaperBirdMaster 2012

24
@PaperBirdMaster : C ++ 표준 라이브러리 헤더 파일 정보가 없습니다 : <iostream>, <vector>, <cstdlib>, 떨어져 C 호환성을 위해 포함 된 것과 : <stdint.h>, <stdlib.h>. 그리고 예, 이니셜 c은 C ++와 같은 완전히 새로운 것이 아니라 <cstdlib>C 표준 헤더에 해당하는 C ++ 임을 나타냅니다 . C ++ 헤더 가 있으므로 향후 버전의 C가 표준 헤더를 도입하지 않기를 바랍니다 . <stdlib.h><vector><complex><omplex.h>
Steve Jessop 2011

@SteveJessop 음, C99?
SS Anne

1
@ 고 말했다 JL2210 통지하는 것이 <omplex.h>아니라 <complex.h>. C가 추가 된 <omplex.h>경우 해당 C ++는 <complex>.
John Leuenhagen

16

를 포함하면 cstdintstd 네임 스페이스 및 가능하면 글로벌 네임 스페이스의 심볼 이름을 가져옵니다 .
Including stdint.h은 전역 네임 스페이스 및 가능하면 std 네임 스페이스의 심볼 이름을 가져옵니다 .

C 표준 라이브러리의 기능은 C ++ 표준 라이브러리에서도 제공되며 일반적인 명명 규칙으로 C 표준 라이브러리의 해당 이름 앞에 c가 추가됩니다.

C ++에서는 다음을 사용해야합니다.

#include <cstdint>

std::
C에서 사용하는 기호 이름을 완전히 한정 하려면 다음을 사용해야합니다.

#include <stdint.h>

부록 D (표준) 호환성 기능 [depr] 은 다음과 같이 설명합니다.

D.6 C 표준 라이브러리 헤더

1 C 표준 라이브러리 및 C 유니 코드 TR과의 호환성을 위해 C ++ 표준 라이브러리는 표 151과 같이 25 개의 C 헤더를 제공합니다.

포함하고있는:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

그리고

2 각각 형식의 이름을 갖는 모든 C 헤더 name.h는 해당하는 표준 라이브러리 네임 스페이스에 배치 된 각 이름 cname header이 글로벌 네임 스페이스 범위 내에 배치되는 것처럼 작동 합니다. 이러한 이름이 std 네임 스페이스의 네임 스페이스 범위 (3.3.6) 내에서 처음 선언되었는지 또는 정의되었는지 여부는 지정되지 않고 명시 적 using-declarations (7.3.3)에 의해 전역 네임 스페이스 범위에 삽입됩니다.

3 [예 : 헤더 <cstdlib>는 std 네임 스페이스 내에서 선언 및 정의를 확실히 제공합니다. 또한 전역 네임 스페이스 내에서 이러한 이름을 제공 할 수 있습니다. 헤더 <stdlib.h>는 C 표준에서와 마찬가지로 전역 네임 스페이스 내에서 동일한 선언과 정의를 확실히 제공합니다. std 네임 스페이스 내에서 이러한 이름을 제공 할 수도 있습니다. -예제 종료]


-1
  1. cstdintC ++ 11 헤더, stdint.hC99 헤더 (C와 C ++는 다른 언어입니다!)

  2. MSVC 2008 년 어느 쪽도 포함하지 stdint.h않고 cstdint.

  3. 의 구현 cstdint은 대부분 단순히 #include <stdint.h>네임 스페이스 / 언어 수정으로 이루어집니다.


2
3. 틀렸다. cstdint구현을 네임 스페이스로 끌어 올릴 필요가 있습니다 std.
Konrad Rudolph 2012

1
1. 또한 틀린 경우 stdint.h는 C ++ 표준의 표준 부록 D에서 C ++ 라이브러리의 일부로 정의됩니다.
진정

@chill, Annex D에 대한 링크를 제공해 주시겠습니까? 여기 en.cppreference.com/w/cpp/types/integer 는 C ++ 11 헤더라고 명시했습니다.
hate-engine

1
@ hate-engine, C ++ 표준 사본에서 찾아 보는 것이 좋습니다. 그 cppreference 페이지에는 stdint.h. cstdintC ++ 헤더 인 인수 는 없습니다 .
진정

2
1의 어떤 부분도 거짓 stdint.h이 아닙니다. 마치 C ++ 11의 일부가 아니라고 말한 것처럼 합쳐진 것 입니다. 실제로 C ++ 11에서 필요합니다. " intis in C ++ 11; longis in C99; C와 C ++ are different languages!" 라고 말할 수 있으며, 그 어떤 부분도 거짓이 아닙니다. 하지만 C ++ 11은 stdint.h및 의 내용을 정의하기 위해 부분적으로 C99를 cstdint참조하지만을 정의하기 위해 C를 참조하지 않기 때문에 내 예제는 훨씬 더 오해의 소지 가 int있습니다.
Steve Jessop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.