왜 C 프로그래머들은 기본 타입의 이름을 바꾸기 위해 typedefs를 사용하는가?
그래서 저는 C 전문가와는 거리가 멀지만, 제가 오랫동안 읽고 있는 코드에 대해 신경이 쓰이고 있습니다.왜 C(+) 프로그래머가 단순한 타입의 이름을 바꾸기 위해 typedef를 사용하는지 설명해 주실 수 있나요?구조물에 사용하는 이유는 이해합니다만, 제가 본 선언의 이유는 정확히 무엇입니까?
typedef unsigned char uch;
typedef uch UBYTE;
typedef unsigned long ulg;
typedef unsigned int u32;
typedef signed short s16;
제가 알기 어려운 장점이 있나요? (Java에서 시작되어 엄격하게 안전한 언어를 사용하지 않은 프로그래머)왜냐하면 저는 그 이유를 생각할 수 없기 때문입니다.프로젝트에 익숙하지 않은 사람들이 코드를 읽을 수 없게 될 것 같기 때문입니다.
저를 C초보자 취급해 주세요.솔직히 저는 그것에 대해 아는 것이 거의 없고, 처음부터 제가 오해하고 있었던 것 같습니다.;)
노출된 의미/특성을 변경하지 않고 유형 이름을 변경하는 것은 의미가 없습니다.이 예에서는
typedef unsigned char uch;
typedef unsigned long ulg;
그 범주에 속합니다.이름을 짧게 짓는 것 말고는 요점을 모르겠어요.
하지만 이 사람들은
typedef uch UBYTE;
typedef unsigned int u32;
typedef signed short s16;
전혀 다른 이야기예요예를들면,s16signed 16 bit type을 나타냅니다.이 타입은 반드시signed short. 뒤에 숨길 특정 유형s16플랫폼에 의존합니다.프로그래머는 여러 플랫폼에 대한 지원을 단순화하기 위해 이 추가 수준의 명명 간접을 도입합니다.다른 플랫폼에서 서명된 16비트 타입이 우연히signed int프로그래머는 typedef 정의를 하나만 변경하면 됩니다. UBYTE분명히 부호 없는 머신의 바이트 타입을 나타내는 것으로, 반드시 그런 것은 아닙니다.unsigned char.
C99 사양은 다음과 같은 특정 폭의 적분 유형에 대한 표준 명명법을 이미 제공하고 있습니다.int16_t,uint32_t기타 등등.C99를 지원하지 않는 플랫폼에서는 이 표준 명명 규칙을 따르는 것이 더 합리적일 수 있습니다.
이것에 의해, 휴대성이 향상됩니다.예를 들어 부호 없는 32비트 정수 유형이 필요합니다.그것은 어떤 표준형입니까?아직 모릅니다.실장 정의되어 있습니다.그래서 네가typedef32비트 부호 없는 정수로 구분하여 코드에 새 유형을 사용합니다.다른 C 구현에서 컴파일이 필요한 경우 변경만 하면 됩니다.typedefs.
때때로 그것은 다루기 힘든 것을 줄이기 위해 사용됩니다.volatile unsigned long조금 더 콤팩트한 것, 예를 들면vuint32_t.
또, 다음과 같은 타입이 있기 때문에, 휴대성에 도움이 됩니다.int각 플랫폼에서 항상 같은 것은 아닙니다.typedef를 사용하면 모든 소스 코드를 변경하지 않고도 원하는 스토리지 클래스를 플랫폼의 가장 가까운 일치 항목으로 설정할 수 있습니다.
거기에는 많은 이유가 있다.제가 생각하는 건
- 타이프네임은 짧아지기 때문에 코드도 작아지고 읽기 쉬워집니다.
- 긴 구조물 이름에 대한 별칭 효과.
- 특정 팀/회사/스타일에 사용되는 관례입니다.
- 이식 - 모든 OS 및 머신에서 동일한 이름을 사용합니다.네이티브 데이터 구조는 약간 다를 수 있습니다.
다음은 The C Programming Language(K&R)의 인용문입니다.
순수하게 미적인 문제 외에도, 타이프 데프를 사용하는 두 가지 주요 이유가 있습니다.
첫 번째 - 프로그램을 매개 변수화합니다.
첫 번째는 휴대성 문제에 대해 프로그램을 파라미터화하는 것입니다.시스템에 의존할 수 있는 데이터 유형에 typedef를 사용하는 경우 프로그램을 이동할 때 typedef만 변경하면 됩니다.
일반적인 상황 중 하나는 다양한 정수 수량에 typeef 이름을 사용한 후 각 호스트 시스템에 대해 short, int 및 long을 적절하게 선택하는 것입니다.표준 라이브러리의 size_t 및 ptrdiff_t와 같은 유형을 예로 들 수 있습니다.
이탤릭체로 표시된 부분은 프로그래머가typedefportability의 basic type.다른 컴파일러를 사용하여 프로그램이 다른 플랫폼에서 동작하는지 확인하고 싶다면 가능한 모든 방법으로 이식성을 확보합니다.typedef그 중 하나입니다.
윈도우 플랫폼에서 Turbo C 컴파일러를 사용하여 프로그래밍을 시작했을 때, 그것은 우리에게 다음과 같은 크기를 주었습니다.int2. Linux 플랫폼과 GCC 컴파일러로 옮겼을 때 받은 사이즈는 4입니다.만약 내가 Turbo C를 사용하여 프로그램을 개발했다면, 그것은 다음과 같은 주장에 의존했다.sizeof( int )항상 2개이기 때문에 새 플랫폼으로 제대로 포팅되지 않았을 수 있습니다.
도움이 됐으면 좋겠다.
K&R의 다음 인용문은 당신의 질의와 관련이 없지만, 저도 완성하기 위해 올렸습니다.
두 번째 - 더 나은 문서 제공
typedefs의 두 번째 목적은 프로그램에 대한 더 나은 문서를 제공하는 것입니다. Treeptr이라고 하는 유형은 복잡한 구조에 대한 포인터로서만 선언된 유형보다 이해하기 쉽습니다.
Most of these patterns are bad practices that come from reading and copying existing bad code. Often they reflect misunderstandings about what C does or does not require.
- Is akin to
#define BEGIN {except it saves some typing instead of making for more. - Is akin to
#define FALSE 0. If your idea of "byte" is the smallest addressable unit,charis a byte by definition. If your idea of "byte" is an octet, then eithercharis the octet type, or your machine has no octet type. - Is really ugly shorthand for people who can't touch type...
- Is a mistake. It should be
typedef uint32_t u32;or better yet,uint32_tshould just be used directly. - Is the same as 4. Replace
uint32_twithint16_t.
Please put a "considered harmful" stamp on them all. typedef should be used when you really need to create a new type whose definition could change over the life cycle of your code or when the code is ported to different hardware, not because you think C would be "prettier" with different type names.
We use it to make it Project/platform specific, everything has a common naming convention
pname_int32, pname_uint32, pname_uint8 -- pname is project/platform/module name
And some #defines
pname_malloc, pname_strlen
It easier to read and shortens long datatypes like unsigned char to pname_uint8 also making it a convention across all modules.
When porting you need to just modify the single file , thus making porting easy.
To cut the long story short, you might want to do that to make your code portable (with less effort/editing). This way you don't depend to 'int', instead you are using INTEGER that can be anything you want.
All [|u]intN_t types, where N=8|16|32|64 and so forth, are defined per architecture in this exact manner. This is a direct consequence of the fact that the standard does not mandate that char,int,float, etc. have exactly N bits - that would be insane. Instead, the standard defines minimum and maximum values of each type as guarantees to the programmer, and in various architectures types may well exceed those boundaries. It is not an uncommon sight.
The typedefs in your post are used to defined types of a certain length, in a specific architecture. It's probably not the best choice of naming; u32그리고.s16너무 짧다고 생각합니다.그리고 이름을 공개하는 건 좀 안 좋은 것 같아요ulg그리고.uch어플리케이션 고유의 문자열이 프리픽스에 붙을 수 있습니다.이것은, 이러한 문자열은, 확실히 공개되지 않기 때문입니다.
이게 도움이 됐으면 좋겠다.
언급URL : https://stackoverflow.com/questions/3340843/why-do-c-programmers-use-typedefs-to-rename-basic-types
'source' 카테고리의 다른 글
| Windows WSL2에서 Ubuntu의 MariaDB에 있는 INSERT INTO ...에 삽입하면 일부 열의 데이터가 손상됩니다. (0) | 2022.09.23 |
|---|---|
| 발리와 동시에 요청할 수 있습니까? (0) | 2022.09.23 |
| php의 print_r()에 해당하는 것은 무엇입니까? (0) | 2022.09.23 |
| 바이너리 조회를 사용하면 어떤 효과가 있습니까? (0) | 2022.09.23 |
| C프로그램의 정수를 위한 역사적인 typedef 수프는 무엇이었나요? (0) | 2022.09.23 |