Development Tip

"std :: size_t"가 C ++에서 의미가 있습니까?

yourdevel 2020. 12. 9. 21:51
반응형

"std :: size_t"가 C ++에서 의미가 있습니까?


상속받은 일부 코드 size_t에서 std네임 스페이스 한정자 와 함께 자주 사용되는 것을 볼 수 있습니다 . 예를 들면 :

std::size_t n = sizeof( long );

물론 잘 컴파일되고 실행됩니다. 그러나 그것은 나에게 나쁜 습관처럼 보입니다 (아마 C에서 이어 졌습니까?).

size_tC ++에 내장되어 글로벌 네임 스페이스에 내장되어 있다는 것이 사실이 아닙니까? size_tC ++에서 사용하려면 헤더 파일 포함이 필요 합니까?

이 질문을하는 또 다른 방법은 다음 프로그램 ( 포함 없음 )이 모든 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

반응형