_t(언더스코어-t) 뒤에 이어지는 유형은 무엇을 나타냅니까?
간단한 질문 같지만 Stack Overflow 검색이나 Google에서는 찾을 수 없습니다.type 뒤에 a가 이어지는 것은 무엇입니까?_t못된 짓? 예를 들면?
int_t anInt;
하드웨어에 밀접하게 대처하기 위한 C 코드에서 많이 볼 수 있습니다. 그들이 관련이 있다고 생각하지 않을 수 없습니다.
Douglas Mayle이 지적했듯이, 기본적으로 이것은 유형 이름을 나타냅니다.따라서 변수 또는 함수 이름을 '로 끝내는 것은 바람직하지 않습니다._t혼동을 일으킬 수 있기 때문입니다.게다가size_t, C89 규격은 다음을 정의하고 있습니다.wchar_t,off_t,ptrdiff_t그리고 아마 내가 잊은 다른 것들이 있을 거야.C99 규격에서는 다음과 같은 많은 추가 유형을 정의하고 있습니다.uintptr_t,intmax_t,int8_t,uint_least16_t,uint_fast32_t기타 등등.이러한 새로운 유형은 에서 정식으로 정의됩니다.<stdint.h>하지만 대부분의 경우,<inttypes.h>(일반적으로 표준 C 헤더에 대해서는) 다음을 포함합니다.<stdint.h>.그것(<inttypes.h>)는, 에서 사용하는 매크로도 정의합니다.printf()그리고.scanf().
Matt Curtis가 지적했듯이, 접미사는 컴파일러에게 의미가 없습니다.이것은 인간 지향의 규약입니다.
다만, POSIX 에서는, 「」로 끝나는 많은 여분의 타입명이 정의되고 있는 것에 주의해 주세요._t' 및 구현을 위해 서픽스를 예약합니다.즉, POSIX 관련 시스템에서 작업하는 경우 규칙을 사용하여 자신의 유형 이름을 정의하는 것은 현명하지 못한 행동입니다.제가 작업하고 있는 시스템은 (20년 이상) 그것을 해 왔습니다.우리는 우리가 정의한 것과 같은 이름의 타입을 정의하는 시스템에 의해 정기적으로 문제가 발생합니다.
그_t일반적으로 불투명 유형 정의를 래핑합니다.
GCC는 로 끝나는 이름만 추가합니다._t사용할 수 없는 예약된 네임스페이스로 이동하여 향후 버전의 Standard C 및 POSIX(GNU C 라이브러리 설명서)와의 충돌을 방지합니다.몇 가지 조사 끝에 POSIX Standard 1003.1: B.2.12 Data Types(볼륨:근거, 부록: B. 시스템 인터페이스의 근거, 장: B.2 일반 정보:
B.2.12 데이터 유형
정의된 유형
이 섹션에서 정의된 추가 유형이 "_t"로 끝나야 한다는 요건은 이름 공간 오염 문제에서 비롯되었습니다.프로그램의 이름 공간에 기호를 추가하지 않고 하나의 헤더 파일에 유형(POSIX.1-2017에서 정의된 유형이 아닌 경우)을 정의하고 다른 헤더 파일에서 사용하는 것은 어렵습니다.실장자가 독자적인 타입을 제공할 수 있도록 하기 위해서, 모든 적합 애플리케이션은, 「_t」로 끝나는 기호를 회피할 필요가 있습니다.이것에 의해, 실장자는 추가 타입을 제공할 수 있습니다.유형의 주요 용도는 구조 부재의 정의에 있으며, 구조 부재는 POSIX.1-2017에서 정의된 구조에 추가될 수 있으며 많은 경우 추가 유형의 필요성이 있습니다.
간단히 말해서, 이 기준서는 표준 유형의 목록을 확장할 가능성이 높기 때문에 이 기준서는 다음을 제한한다._t네임스페이스를 사용합니다.
예를 들어, 프로그램이 POSIX 1003.1과 일치합니다. 문제 7에서 유형을 정의했습니다.foo_t. POSIX 1003.1 문제 8은 최종적으로 새로 정의된 유형으로 출시됩니다.foo_t사용 중인 프로그램이 새 버전과 일치하지 않으므로 문제가 있을 수 있습니다.의 제한_t를 사용하면 코드가 리팩터링되지 않습니다.따라서 POSIX 준거를 목표로 하는 경우, 반드시 다음 사항을 피해야 합니다._t표준이 규정하는 바와 같이.
단점: 저는 POSIX가 깨끗한 프로그래밍에 좋은 기본을 제공한다고 생각하기 때문에 POSIX를 고수하려고 합니다.또한 Linux 코딩 스타일(5장) 가이드라인을 매우 좋아합니다.typedef를 사용하지 않는 몇 가지 좋은 이유가 있습니다.도움이 되었으면 좋겠다!
이것은 데이터 타입의 이름을 붙이기 위해 사용되는 규칙입니다.예를 들어,typedef:
typedef struct {
char* model;
int year;
...
} car_t;
그_t특별한 의미는 없습니다.그러나 이 방법은 일반적으로 사용되고 있습니다._ttypedef에 접미사를 붙입니다.
변수 이름 지정에 대한 일반적인 C 관행에 더 익숙할 수 있습니다.이는 포인터 앞에 p를 붙이고 글로벌 변수 앞에 밑줄을 사용하는 것과 비슷하며(이것은 조금 덜 일반적입니다), 변수 이름을 사용하는 것과 비슷합니다.i,j,그리고.k를 지정합니다.
단어 크기와 순서가 중요한 코드에서는 다음과 같이 명확한 사용자 정의 유형을 사용하는 것이 일반적입니다.BYTE WORD(16비트 지원)DWORD(32비트).
int_t그다지 좋은 것은 아닙니다.왜냐하면 의 정의는int플랫폼마다 다릅니다.그러니까 누구의int(현재 대부분의 PC 중심 개발에서는 32비트로 취급되고 있지만 PC 이외의 개발에서는 int를 16비트로 취급하고 있습니다).
유형이라는 뜻이에요. size_t사이즈 타입입니다.
그것은 단지 "유형"을 의미하는 관습일 뿐이다.컴파일러에게는 특별한 의미가 없습니다.
예를 들어 C99에서는 /usr/include/stdint를 사용합니다.h:
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
_t는 항상 typedef에 의해 정의된 것을 의미합니다.
그 주제에 대해 몇 가지 좋은 설명이 있었다.유형을 다시 정의해야 하는 다른 이유를 추가합니다.
많은 임베디드 프로젝트에서는 지정된 사이징을 유형에 맞게 올바르게 기술하고 다양한 플랫폼(하드웨어 타입 컴파일러 등) 간의 이식성을 개선하기 위해 모든 타입이 재정의되어 있습니다.
또 다른 이유는 다른 OS 간에 코드를 이식할 수 있도록 하고 코드에 통합하는 OS 내의 기존 유형과의 충돌을 피하기 위해서입니다.이를 위해 보통 하나의(가능한) 프리픽스가 추가됩니다.
예:
typedef unsigned long dc_uint32_t;
일반적으로 typedefs로 정의되는 데이터 유형의 표준 명명 규칙입니다.하드웨어 레지스터를 취급하는 많은 C코드는 서명된 고정 사이즈 데이터 유형과 서명되지 않은 고정 사이즈 데이터 유형에 C99 정의 표준 이름을 사용합니다.규칙으로서 이러한 이름은 표준 헤더 파일(stdint.h)에 있으며 _t로 끝납니다.
하드웨어 인터페이스 코드를 취급하고 있는 경우, 보고 있는 코드의 작성자가 정의했을 가능성이 있습니다.int_t특정 크기의 정수로 지정합니다.C 표준에서는 특정 크기를 할당하지 않습니다.int(사용하는 컴파일러와 타겟 플랫폼에 따라 다를 수 있음) 및 특정 컴파일러를 사용하여int_ttype을 지정하면 이동성 문제를 방지할 수 있습니다.
이는 하드웨어 인터페이스 코드에 대해 특히 중요한 고려사항이며, 따라서 이 규칙을 처음 알게 될 수도 있습니다.
언급URL : https://stackoverflow.com/questions/231760/what-does-a-type-followed-by-t-underscore-t-represent
'programing' 카테고리의 다른 글
| 상위 vue와 하위 vue 간의 비동기 라이프사이클 (0) | 2022.07.29 |
|---|---|
| VueJ가 어레이의 개체에 이 속성이 추가되었음을 감지하는 이유는 무엇입니까? (0) | 2022.07.29 |
| Java Map의 각 엔트리에 대해 효율적으로 반복하려면 어떻게 해야 합니까? (0) | 2022.07.29 |
| Java의 객체와 같은 구조 (0) | 2022.07.29 |
| Vuex 알 수 없는 작업 유형...동작이 로딩되지 않음 (0) | 2022.07.29 |