답변:
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_t
이 std
네임 스페이스 에서 정의한다는 것 입니다.
또한 위의 행에는 "다음 변경 사항이 있음"이 표시 되어 있음을 알 수 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 의이 페이지 에서 읽을 수 있습니다 .
size_t
없이 말하면 오류 입니다. 그러나 대부분의 컴파일러는이를 허용하고 표준에서는이를 허용합니다 (§D.5 / 3). using namespace std;
using std::size_t;
<cstddef>
는 선언하거나 선언하지 않을 ::size_t
수 있으므로 <stddef.h>
C 라이브러리의 헤더를 명시 적으로 포함 하거나 선언하지 않는 한 헤더에 의존하거나 존재하지 않을 수 있습니다.
::size_t
드린 것처럼가 예를 들어에 <stddef.h>
있으므로 님에게 항상 자격을 부여 할 필요는 없습니다 std::
.
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
정의 된 변형에 의존해서는 안 됩니까?
#include <stddef.h>
다음 std::size_t
수도 있고 사용하지 못할 수 있습니다. 이 경우 #include <cstddef>
다음 std::size_t
사용할 수 있지만 size_t
힘이 없습니다.
std::
하며 단락에서는 최상위 네임 스페이스 에서 헤더를 정의 할 수도 있으며, 그렇다면 네임 스페이스 std::
와 최상위 레벨 에서 동일하게 정의해야합니다 . 대부분의 컴파일러는 C 헤더 만 포함하고 이름을로 가져 오므로 std::
기호가 둘 다에 정의됩니다.
std::
C 쇼어에서 오는 <cxxxxx> 헤더 또는 식별자 의 변형을 귀찮게하지 않습니다 . 나는 <xxxxx.h>
표준 C 헤더를 고수한다 -결코 문제가되지 않았다. 그래서 나는 사용 <stddef.h>
하고 size_t
결코 다시 생각하지 않습니다 std::size_t
. 사실, 그것은 (또는 있을지 모릅니다) 내 마음을 결코 넘지 않습니다 std::size_t
.
std :: size_t 는 실제로 stddef.h 의 size_t 입니다.
cstddef 는 다음을 제공합니다.
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... 효과적으로 이전 정의를 std 네임 스페이스로 가져옵니다.
<cstddef>
얻을 것으로 예상 ::size_t
되지만 포함 <stddef.h>
하면 얻을 수 std::size_t
있습니다.
<stddef.h>
하면 당신을 얻을 것 ::size_t
입니다.
<cstddef>
하면 얻을 보장되고 얻을 std::size_t
수도 있습니다 ::size_t
(그러나 보장되지는 않습니다). 당신이 포함 <stddef.h>
하면 얻을 보장되고 얻을 ::size_t
수도 있습니다 std::size_t
(그러나 보장되지는 않습니다). C ++ 03에서는 달랐지만 실제로는 구현할 수 없었으며 결함으로 수정되었습니다.