답변:
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 년 이상) 그것을 해왔다. 우리는 정의한 것과 같은 이름을 가진 유형을 정의하는 시스템에 의해 정기적으로 트립됩니다.
abbr_xxxxx_t
유형 이름 을 사용하는 것이 안전 할 수 있습니다 . 이러한 접두사가 없으면 언제든지 잡힐 수 있습니다. 일반적으로, 표준화 _t
유형 (모두 소문자를 사용 FILE
하고 DIR
- 아니 모두 대문자, 두 번이 개 예외입니다 _t
당신이 사용할 수 있도록) CamelCase_t
또는 선도 캡 않고, 적당한 안전을. 내가 주로 작업하는 시스템은 위험하게 살고 _t
어쨌든 사용하는 경향이 있지만 가끔씩 우리를 물리 쳤다. 나는 CamelCase
내 작업에 접미사없이 사용하는 경향이있다 . 내 기능은 대개 모두 소문자입니다.
은 _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를 사용하지 않는 데에는 몇 가지 이유가 있습니다. 이 도움을 바랍니다!
는 _t
본질적으로 특별한 의미가 없습니다. 그러나 _t
typedef에 접미사를 추가하는 것이 일반적으로 사용되었습니다 .
변수 이름 지정에 대한 일반적인 C 관행에 더 익숙 할 수 있습니다 ... 이것은 포인터 앞에 ap를 붙이고 전역 변수 앞에 밑줄을 사용하는 것이 일반적입니다 (약간 덜 일반적입니다) , 변수 이름을 사용하는 i
, j
및 k
임시 루프 변수를.
단어 크기와 순서가 중요한 코드에서는 BYTE
WORD
(일반적으로 16 비트) DWORD
(32 비트) 와 같이 명시적인 사용자 정의 형식을 사용하는 것이 매우 일반적 입니다.
int_t
의 정의는 int
플랫폼마다 다르기 때문에 그다지 적합하지 않습니다 int
. (현재 대부분의 PC 중심 개발에서는 32 비트로 처리하지만 비 PC 개발에서는 여전히 int를 16 비트로 처리합니다).
주제에 대한 몇 가지 좋은 설명이있었습니다. 유형을 다시 정의하는 또 다른 이유를 추가하십시오.
많은 임베디드 프로젝트에서 모든 유형은 지정된 크기를 유형에 올바르게 명시하고 다른 플랫폼 (예 : 하드웨어 유형 컴파일러)에서의 이식성을 향상시키기 위해 재정의됩니다.
다른 이유는 다른 OS에서 코드를 이식 가능하게 만들고 코드에 통합하는 OS의 기존 유형과의 충돌을 피하기 위해서입니다. 이를 위해 일반적으로 고유 한 (가능한 경우) 접두사가 추가됩니다.
예:
typedef unsigned long dc_uint32_t;
하드웨어 인터페이스 코드를 다루는 경우,보고있는 코드 작성자가 int_t
특정 크기 정수로 정의되었을 수 있습니다 . C 표준은 특정 크기를 int
유형에 할당하지 않으며 (컴파일러 및 대상 플랫폼에 따라 다름) 특정 int_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로 정의됩니다.
int_t
정의되어 있습니까? 항상로 정의되어 있으면int
유용하지 않습니다.int
직접 사용하는 것이 훨씬 명확합니다 . 항상로 정의되지 않은 경우int
(예 :long int
또는 이면 가능short int
) 잘못 선택되고 혼동되는 이름입니다.