"std :: size_t"가 C ++에서 의미가 있습니까?
상속받은 일부 코드 size_t
에서 std
네임 스페이스 한정자 와 함께 자주 사용되는 것을 볼 수 있습니다 . 예를 들면 :
std::size_t n = sizeof( long );
물론 잘 컴파일되고 실행됩니다. 그러나 그것은 나에게 나쁜 습관처럼 보입니다 (아마 C에서 이어 졌습니까?).
size_t
C ++에 내장되어 글로벌 네임 스페이스에 내장되어 있다는 것이 사실이 아닙니까? size_t
C ++에서 사용하려면 헤더 파일 포함이 필요 합니까?
이 질문을하는 또 다른 방법은 다음 프로그램 ( 포함 없음 )이 모든 C ++ 컴파일러 에서 컴파일 될 것으로 예상되는 것 입니까?
size_t foo()
{
return sizeof( long );
}
이것에 대해 stackoverflow 군중 사이에 혼란이있는 것 같습니다
::size_t
이전 버전과의 호환성 헤더에 정의되어 stddef.h
있습니다. 그것은의 한 부분이었다 ANSI/ISO C
그리고 ISO C++
자신의 처음입니다. 모든 C ++ 구현은 stddef.h
(호환성)과 함께 제공되어야 cstddef
하며 후자 만 정의 std::size_t
하고 반드시 ::size_t
. C ++ 표준의 부록 D를 참조하십시오.
C ++ 표준의 섹션 17.4.1.2, 단락 4에는 다음이 명시되어 있습니다.
"그러나 C ++ 표준 라이브러리에서 선언 및 정의 (C에서 매크로로 정의 된 이름 제외)는 네임 스페이스 std의 네임 스페이스 범위 (3.3.5) 내에 있습니다."
여기에는 size_t를 정의하는 cstddef를 포함하여 cname 패턴의 헤더에있는 항목이 포함됩니다 .
따라서 std :: size_t는 실제로 정확합니다.
size_t
예를 들어 <stddef.h>
대신을 포함하여 전역 네임 스페이스에 들어갈 수 있습니다 <cstddef>
. 분명한 이점이 보이지 않으며 기능이 더 이상 사용되지 않습니다.
size_t는 C ++에 내장되어 있지 않습니다. 그리고 기본적으로 정의되어 있지 않습니다. 이것은 GCC로 컴파일되지 않습니다.
int main(int argc, char** argv) {
size_t size;
}
즉, size_t는 POSIX의 일부이며와 같은 기본적인 것만 사용 <cstdlib>
하면 결국 정의 될 것입니다.
std :: size_t가 size_t에 해당하는 C ++라고 주장 할 수 있습니다. Brian이 지적했듯이 std ::는 모든 사람에게 맞지 않는 전역 변수 설정을 피하기 위해 네임 스페이스로 사용됩니다. 루트 네임 스페이스에 정의되었을 수도있는 std :: string과 같습니다.
std::size_t n = sizeof( long );
실제로, 당신은 위의 내용에서 구체적으로 나쁜 습관으로 보이는 것을 묻지 않았습니다. size_t 사용, std 네임 스페이스를 사용한 자격, ...
C ++ 표준 (18.1)에 따르면 size_t는 표준 헤더에 정의 된 유형입니다. 나는 C 언어로부터 가능한 상속에 대한 생각과 인상을 버리는 것이 좋습니다. C ++는 별도의 다른 언어이므로 그렇게 생각하는 것이 좋습니다. 자체 표준 라이브러리가 있으며 C ++ 표준 라이브러리의 모든 요소는 네임 스페이스 std 내에 정의됩니다. 그러나 C ++ 프로그램에서는 C Standard Library의 요소를 사용할 수 있습니다.
나는 더러운 해킹으로 포함하는 것을 고려할 것입니다. C ++ 표준에 따르면 헤더의 내용이 동일하거나 C 표준 라이브러리의 해당 헤더를 기반으로하지만 많은 경우 변경 사항이 적용되었습니다. 즉, C 헤더를 C ++ 헤더에 직접 복사하여 붙여 넣는 것이 아닙니다.
size_t는 C ++의 내장 유형이 아닙니다. sizeof ()의 실제 반환 유형이 구현 정의되어 있으므로 sizeof () 연산자의 반환 유형으로 어떤 정수 유형을 사용할지 지정하기 위해 정의 된 유형이므로 C ++ Standard는 size_t를 정의하여 통합합니다.
다음 프로그램 (포함 없음)이 모든 C ++ 컴파일러에서 컴파일 될 것으로 예상됩니까?
size_t foo() { return sizeof( long ); }
C ++ 표준에 따르면 (1.4) :
라이브러리에 정의 된 이름에는 네임 스페이스 범위 (7.3)가 있습니다. AC ++ 변환 단위 (2.1)는 적절한 표준 라이브러리 헤더 (16.2)를 포함하여 이러한 이름에 대한 액세스 권한을 얻습니다.
size_t는 std 네임 스페이스 내에 정의 된 이름이므로이 이름을 사용하는 모든 프로그램은이 경우 해당 헤더를 포함해야합니다.
다음으로 3.7.3 장은 다음과 같이 말합니다.
그러나 std, std :: bad_alloc 및 std :: size_t를 참조하면 이름이 적절한 헤더를 포함하여 선언되지 않는 한 잘못된 형식입니다.
따라서 size_t를 사용하지만 헤더를 포함하지 않는 프로그램은 형식이 잘못되었습니다.
때로는 다른 라이브러리가 자체 size_t를 정의합니다. 예를 들어 부스트. std :: size_t는 확실히 C ++ 표준을 원한다는 것을 지정합니다.
size_t는 C ++ 표준 유형이며 네임 스페이스 std 내에 정의됩니다.
GNU 컴파일러 헤더에는 다음과 같은 내용이 포함됩니다.
typedef long int __PTRDIFF_TYPE__; typedef unsigned long int __SIZE_TYPE__;
그런 다음 stddef.h는 다음과 같이 구성합니다.
typedef __PTRDIFF_TYPE__ ptrdiff_t; typedef __SIZE_TYPE__ size_t;
마지막으로 cstddef 파일에는 다음과 같은 내용이 포함됩니다.
#include <stddef.h> namespace std { :: ptrdiff_t 사용; :: size_t 사용; }
I think that should make it clear. As long as you include <cstddef> you can use either size_t or std::size_t because size_t was typedefed outside the std namespace and was then included. Effectively you have
typedef long int ptrdiff_t; typedef unsigned long int size_t; namespace std { using ::ptrdiff_t; using ::size_t; }
I think the clarifications are clear enough. The std::size_t
makes good sense in C++ and ::size_t
make (at least) good sense in C.
However a question remain. Namely whether it is safe to assume that ::size_t
and std::size_t
are compatible?
From a pure typesafe perspective they are not necessarily identical unless it is defined somewhere that they must be identical.
I think many are using something a la:
----
// a.hpp
#include <string>
void Foo( const std::string & name, size_t value );
-----
// a.cpp
#include "a.hpp"
using namespace std;
void Foo( const string & name, size_t value )
{
...
}
So in the header you defintely use the ::size_t
while in the source file you'll use std::size_t
. So they must be compatible, right? Otherwise you'll get a compiler error.
/Michael S.
참고URL : https://stackoverflow.com/questions/237370/does-stdsize-t-make-sense-in-c
'Development Tip' 카테고리의 다른 글
만드는 방법 (0) | 2020.12.09 |
---|---|
변수를 항상 계산 결과와 같게 만들려면 어떻게해야합니까? (0) | 2020.12.09 |
iOS에서 탐색 모음으로보기의 탭 모음을 숨기거나 표시하는 방법은 무엇입니까? (0) | 2020.12.09 |
파일의 모든 줄 시작 부분에 숫자 추가 (0) | 2020.12.09 |
ORA-00911 : 잘못된 문자 (0) | 2020.12.09 |