_t (밑줄 -t)가 뒤에 오는 유형은 무엇을 나타 냅니까?


261

이것은 간단한 질문처럼 보이지만 스택 오버플로 검색이나 Google에서 찾을 수 없습니다. 유형 뒤에는 _t평균이 무엇입니까? 와 같은

int_t anInt;

C 코드에서는 하드웨어와 밀접하게 관련되어 있다는 것을 알 수 있습니다. 하드웨어와 관련이 있다고 생각할 수는 없습니다.


3
어디에 int_t정의되어 있습니까? 항상로 정의되어 있으면 int유용하지 않습니다. int직접 사용하는 것이 훨씬 명확합니다 . 항상로 정의되지 않은 경우 int(예 : long int또는 이면 가능 short int) 잘못 선택되고 혼동되는 이름입니다.
키이스 톰슨

답변:


213

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 년 이상) 그것을 해왔다. 우리는 정의한 것과 같은 이름을 가진 유형을 정의하는 시스템에 의해 정기적으로 트립됩니다.


4
OS와 공통 런타임 라이브러리는 일반 이름으로 유형을 정의하는 것이 합리적입니다. 그러나 귀사의 유형에 접두사 또는 접두사가 붙지 않아야합니까?
Toybuilder

17
나는 그것을 피하기 위해 typedef에 _t 대신 _type을 사용합니다.
CesarB

4
@Jonathan Leffler-사용자 정의 유형에 어떤 명명 규칙을 사용 하시겠습니까?
J. Andrew Laughlin

15
@Andrew : 접두어로 사용하기에 편리한 약어가 있다면, abbr_xxxxx_t유형 이름 을 사용하는 것이 안전 할 수 있습니다 . 이러한 접두사가 없으면 언제든지 잡힐 수 있습니다. 일반적으로, 표준화 _t유형 (모두 소문자를 사용 FILE하고 DIR- 아니 모두 대문자, 두 번이 개 예외입니다 _t당신이 사용할 수 있도록) CamelCase_t또는 선도 캡 않고, 적당한 안전을. 내가 주로 작업하는 시스템은 위험하게 살고 _t어쨌든 사용하는 경향이 있지만 가끔씩 우리를 물리 쳤다. 나는 CamelCase내 작업에 접미사없이 사용하는 경향이있다 . 내 기능은 대개 모두 소문자입니다.
Jonathan Leffler

5
@JonathanLeffler, 그 규칙을 사용하기 시작했습니다. CamelCase는 유형에, lower_case는 함수에 사용했습니다. 내가 유일한 사람이 아니기를 바라고이 질문을 검색했습니다. 검증 감사합니다!
Austin Mullins

50

데이터 유형의 이름을 지정하는 데 사용되는 규칙입니다 (예 typedef:


typedef struct {
  char* model;
  int year;
...
} car_t;


43

_t일반적으로 불투명 한 유형 정의를 랩합니다.

GCC _t는 표준 C 및 POSIX (GNU C 라이브러리 매뉴얼)의 향후 버전과의 충돌을 피하기 위해 사용하지 않을 예약 네임 스페이스로 끝나는 이름 만 추가합니다 . 약간의 연구 끝에 마침내 POSIX Standard (1003.1, Rationale (Informative)) 내에서 올바른 참조가 발견되었습니다.

B.2.12 자료형

이 섹션에 정의 된 추가 유형이 ''_t ''로 끝나야한다는 요구 사항은 네임 스페이스 오염 문제로 인해 발생했습니다. 하나의 헤더 파일에서 유형 (IEEE Std 1003.1-2001에 의해 정의 된 유형이 아님)을 정의하고 프로그램의 네임 스페이스에 기호를 추가하지 않고 다른 유형에서 사용하는 것은 어렵습니다. 구현자가 고유 한 유형을 제공 할 수 있도록하기 위해 모든 적합한 응용 프로그램은 ''_t ''로 끝나는 기호를 피해야하며 구현자가 추가 유형을 제공 할 수 있습니다. 유형의 주요 용도는 IEEE Std 1003.1-2001에 정의 된 구조에 추가 될 수있는 (그리고 많은 경우에) 구조 멤버의 정의에 있으므로 추가 유형에 대한 필요성이 절실합니다.

간단히 말해서 표준에 따르면 표준 유형 목록을 확장 할 가능성이 높으므로 표준에 따라 _t네임 스페이스가 자체 사용을 제한합니다 .

예를 들어, 프로그램이 POSIX 1003.1 Issues 6 과 일치 하고 유형을 정의했습니다 foo_t. POSIX 1003.1 이슈 7 은 결국 새로 정의 된 유형으로 릴리스됩니다 foo_t. 프로그램이 새 버전과 일치하지 않아 문제가 될 수 있습니다. 사용을 제한하면 _t코드를 리팩터링 할 수 없습니다. 따라서 POSIX 준수를 목표로하는 _t경우 표준에서 명시한대로 반드시 피해야 합니다.

참고 : 개인적으로 POSIX를 고수하려고 노력합니다. POSIX는 깨끗한 프로그래밍을위한 좋은 기초를 제공한다고 생각하기 때문입니다. 또한 저는 Linux Coding Style (5 장) 지침을 매우 좋아 합니다. typedef를 사용하지 않는 데에는 몇 가지 이유가 있습니다. 이 도움을 바랍니다!


18

데이터 유형에 대한 표준 명명 규칙이며 일반적으로 typedef로 정의됩니다. 하드웨어 레지스터를 다루는 많은 C 코드는 부호있는 및 부호없는 고정 크기 데이터 유형에 C99 정의 표준 이름을 사용합니다. 일반적으로 이러한 이름은 표준 헤더 파일 (stdint.h)에 있으며 _t로 끝납니다.


11

"유형"을 의미하는 규칙 일뿐입니다. 컴파일러에게는 특별한 의미가 없습니다.


11

_t본질적으로 특별한 의미가 없습니다. 그러나 _ttypedef에 접미사를 추가하는 것이 일반적으로 사용되었습니다 .

변수 이름 지정에 대한 일반적인 C 관행에 더 익숙 할 수 있습니다 ... 이것은 포인터 앞에 ap를 붙이고 전역 변수 앞에 밑줄을 사용하는 것이 일반적입니다 (약간 덜 일반적입니다) , 변수 이름을 사용하는 i, jk임시 루프 변수를.

단어 크기와 순서가 중요한 코드에서는 BYTE WORD(일반적으로 16 비트) DWORD(32 비트) 와 같이 명시적인 사용자 정의 형식을 사용하는 것이 매우 일반적 입니다.

int_t의 정의는 int플랫폼마다 다르기 때문에 그다지 적합하지 않습니다 int. (현재 대부분의 PC 중심 개발에서는 32 비트로 처리하지만 비 PC 개발에서는 여전히 int를 16 비트로 처리합니다).



8

주제에 대한 몇 가지 좋은 설명이있었습니다. 유형을 다시 정의하는 또 다른 이유를 추가하십시오.

많은 임베디드 프로젝트에서 모든 유형은 지정된 크기를 유형에 올바르게 명시하고 다른 플랫폼 (예 : 하드웨어 유형 컴파일러)에서의 이식성을 향상시키기 위해 재정의됩니다.

다른 이유는 다른 OS에서 코드를 이식 가능하게 만들고 코드에 통합하는 OS의 기존 유형과의 충돌을 피하기 위해서입니다. 이를 위해 일반적으로 고유 한 (가능한 경우) 접두사가 추가됩니다.

예:

typedef unsigned long dc_uint32_t;

7

하드웨어 인터페이스 코드를 다루는 경우,보고있는 코드 작성자가 int_t특정 크기 정수로 정의되었을 수 있습니다 . C 표준은 특정 크기를 int유형에 할당하지 않으며 (컴파일러 및 대상 플랫폼에 따라 다름) 특정 int_t유형을 사용하면 이식성 문제를 피할 수 있습니다.

이것은 하드웨어 인터페이스 코드에서 특히 중요한 고려 사항이므로, 처음부터 관례를 알게 된 이유 일 수 있습니다.


1
이것은 좋은 습관이 아닐 것입니다. 정의한 크기가 무엇인지 명확하게하기 위해 [u] int_ [32 16 8] _t를 정의해야합니다.
Ilya

1
"int_t"자체는 프로그래머가 사용자 정의 유형이지만 실제로는 그렇지 않다는 것을 프로그래머에게 알려줍니다.
Greg Hewgill

0

예를 들어 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로 정의됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.