size_t와 std :: size_t의 차이점


139

의 차이점은 무엇입니까 size_t하고 std::size_t, 때를 사용하고 다른 차별화 기능해야 그들이 선언 된 곳의 측면에서는?


C ++ 사양이 std :: size_t를 C size_t 유형에 연결하는지 알고 싶습니다.
Doug T.

비슷한 질문보기 : link
Mankarse

답변:


88

C size_t와 C ++ std::size_t는 모두 동일합니다.

C에서는 C 헤더와 내용이 C 헤더와 동일한 <stddef.h>C ++로 정의되어 있습니다 <cstddef>(아래 인용문 참조). sizeof 연산자 결과부호없는 정수 유형 으로 정의됩니다 .

C 표준은 §17.7 / 2에서 말합니다.

size_t 는 sizeof 연산자 결과부호없는 정수 유형 입니다.

그리고 C ++ Standard는 cstddef§18.1 / 3에서 ( 헤더 에 대해 ) 말합니다 .

내용은 다음과 같이 표준 C 라이브러리 헤더 와 동일합니다 .

예, 둘 다 동일합니다. 유일한 차이점은 C ++ size_tstd네임 스페이스 에서 정의한다는 것 입니다.

또한 위의 행에는 "다음 변경 사항이 있음"이 표시 되어 있음을 알 수 size_t있습니다. 오히려 C ++에서 동일한 헤더에 정의 된 언어 (C에는 없음)에 새로 추가 된 내용을 참조합니다.


Wikipedia는 size_t의 범위와 저장 크기에 대한 정보가 매우 좋습니다.

size_t의 범위 및 저장 크기

size_t 의 실제 유형은 플랫폼에 따라 다릅니다 . 일반적인 실수는 ,이 size_t는 프로그래밍 오류가 발생할 수있는 부호 INT와 같은 가정한다 [3] [4] 예를 들어, 64 비트 아키텍쳐 (32)에서 이동하는 경우.

1999 ISO C 표준 (C99)에 따르면 size_t는 16 비트 이상의 부호없는 정수 유형입니다.

나머지 는 Wikipedia 의이 페이지 에서 읽을 수 있습니다 .


STL이 이미 C (cstddef)를 통해 size_t를 가져 오는 경우 다른 Q가있는 이유는 무엇입니까?
Alok 저장

43
@Als : 엄밀히 말하면, 또는 size_t없이 말하면 오류 입니다. 그러나 대부분의 컴파일러는이를 허용하고 표준에서는이를 허용합니다 (§D.5 / 3). using namespace std;using std::size_t;
Potatoswatter

9
@ Potatoswatter : 분명히 오류가 아니며 표준에서 구체적으로 허용 될 수 있습니까? 표준에 있다면 오류가 아닙니다!
벤 Hymers

8
@BenHymers 표준은 표준 헤더가 선언하는 것을 지정하며 예약되지 않은 다른 이름은 선언 할 수 없습니다. 헤더 <cstddef>는 선언하거나 선언하지 않을 ::size_t수 있으므로 <stddef.h>C 라이브러리의 헤더를 명시 적으로 포함 하거나 선언하지 않는 한 헤더에 의존하거나 존재하지 않을 수 있습니다.
Potatoswatter

4
@ Potatoswatter : 아, 지금 무슨 말인지 알 겠어! 한 문장에 너무 많은 "허용"이 혼동되어 왔을 것입니다. 그래도 첫 의견은 너무 강하다고 생각합니다. 방금 말씀 ::size_t드린 것처럼가 예를 들어에 <stddef.h>있으므로 님에게 항상 자격을 부여 할 필요는 없습니다 std::.
벤 Hymers

16

C ++ 03 "17.4.3.1.4 유형"에서 :

표준 C 라이브러리 (각주 169)의 각 유형 T에 대해 :: T 및 std :: T 유형은 구현에 예약되어 있으며 정의 된 경우 :: T는 std :: T와 동일해야합니다.

각주 169 :

이러한 유형은 clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t 및 wint_t입니다.


따라서 이식 가능한 코드는 std::T정의 된 변형에 의존해서는 안 됩니까?
Mankarse

5
@Mankarse : 해당 헤더의 C 버전 만 포함하는 경우 정의되는 것에 의존해서는 안됩니다 . 경우는 #include <stddef.h>다음 std::size_t수도 있고 사용하지 못할 수 있습니다. 이 경우 #include <cstddef>다음 std::size_t사용할 수 있지만 size_t힘이 없습니다.
Dennis Zickefoose

4
@Mankarse : 그 반대. C ++ 버전의 헤더는 헤더를 정의해야 std::하며 단락에서는 최상위 네임 스페이스 에서 헤더를 정의 할 수도 있으며, 그렇다면 네임 스페이스 std::와 최상위 레벨 에서 동일하게 정의해야합니다 . 대부분의 컴파일러는 C 헤더 만 포함하고 이름을로 가져 오므로 std::기호가 둘 다에 정의됩니다.
Jan Hudec

4
개인적으로, 나는 std::C 쇼어에서 오는 <cxxxxx> 헤더 또는 식별자 의 변형을 귀찮게하지 않습니다 . 나는 <xxxxx.h>표준 C 헤더를 고수한다 -결코 문제가되지 않았다. 그래서 나는 사용 <stddef.h>하고 size_t결코 다시 생각하지 않습니다 std::size_t. 사실, 그것은 (또는 있을지 모릅니다) 내 마음을 결코 넘지 않습니다 std::size_t.
Michael Burr

12

std :: size_t 는 실제로 stddef.hsize_t 입니다.

cstddef 는 다음을 제공합니다.

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

... 효과적으로 이전 정의를 std 네임 스페이스로 가져옵니다.


Nawaz가 지적했듯이 실제로는 다른 방향입니다. 포함 할 수 없으며 <cstddef>얻을 것으로 예상 ::size_t되지만 포함 <stddef.h>하면 얻을 수 std::size_t있습니다.
MSalters

4
@MSalters, 나는 따르지 않습니다. 포함 <stddef.h>하면 당신을 얻을 것 ::size_t입니다.
hifier

2
그렇다면 그것은 구현의 버그입니다.
MSalters

4
@MSalters, 나는 잘 따르지 않습니다. 다른 방법이 아니어야합니까? <cstddef>는 C ++에서 제공되므로 std :: *? 반면에 stddef.h와 같은 C 헤더에서는 C 유형, 즉 :: size_t 만 기대합니다.
Ela782

11
@ MSalters, C ++ 11 이후 정확하지 않습니다. 당신이 포함 <cstddef>하면 얻을 보장되고 얻을 std::size_t수도 있습니다 ::size_t(그러나 보장되지는 않습니다). 당신이 포함 <stddef.h>하면 얻을 보장되고 얻을 ::size_t수도 있습니다 std::size_t(그러나 보장되지는 않습니다). C ++ 03에서는 달랐지만 실제로는 구현할 수 없었으며 결함으로 수정되었습니다.
Jonathan Wakely
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.