C 프로그래머가 typedef를 사용하여 기본 유형의 이름을 바꾸는 이유는 무엇입니까?
그래서 나는 C에 대한 전문가와는 거리가 멀지 만 오랫동안 읽은 코드에 대해 뭔가 괴롭힘을 당하고 있습니다. 누군가가 C (++) 프로그래머가 typedef를 사용하여 간단한 유형의 이름을 바꾸는 이유를 설명 할 수 있습니까? 왜 구조체에 사용하는지 이해하지만 선언에 대한 이유는 정확히 무엇입니까?
typedef unsigned char uch;
typedef uch UBYTE;
typedef unsigned long ulg;
typedef unsigned int u32;
typedef signed short s16;
나에게 명확하지 않은 이점이 있습니까 (자바로 시작하고 엄격하게 유형이 안전한 언어를 멀리하지 않은 프로그래머)? 이유를 생각할 수 없기 때문에 프로젝트에 익숙하지 않은 사람들이 코드를 읽을 수 없게 만드는 것 같습니다.
저를 C 초보자처럼 자유롭게 대하십시오. 솔직히 그것에 대해 거의 알지 못하며 처음부터 오해 한 것이있을 것입니다. ;)
노출 된 의미 / 특성을 변경하지 않고 유형의 이름을 바꾸는 것은 의미가 없습니다. 귀하의 예에서
typedef unsigned char uch;
typedef unsigned long ulg;
해당 카테고리에 속합니다. 더 짧은 이름을 만드는 것 외에는 요점이 보이지 않습니다.
하지만 이것들은
typedef uch UBYTE;
typedef unsigned int u32;
typedef signed short s16;
완전히 다른 이야기입니다. 예를 들어, s16
"부호있는 16 비트 유형"을 나타냅니다. 이 유형은 반드시 그런 것은 아닙니다 signed short
. 뒤에 숨길 특정 유형 s16
은 플랫폼에 따라 다릅니다. 프로그래머는 여러 플랫폼에 대한 지원을 단순화하기 위해이 추가 수준의 명명 간접 지정을 도입합니다. 다른 플랫폼에서 서명 된 16 비트 유형이 signed int
인 경우 프로그래머는 하나의 typedef 정의 만 변경하면됩니다. UBYTE
분명히 서명되지 않은 머신 바이트 유형을 나타내며 반드시 unsigned char
.
C99 사양이 이미 같은 특정 폭의 통합 유형에 대한 표준 용어 제공한다는 지적이의 가치 int16_t
, uint32_t
등등을. C99를 지원하지 않는 플랫폼에서이 표준 명명 규칙을 고수하는 것이 더 합리적 일 것입니다.
이것은 이식성을 허용합니다. 예를 들어 부호없는 32 비트 정수 유형이 필요합니다. 어떤 표준 유형입니까? 당신은 모릅니다-구현이 정의되었습니다. 그렇기 때문에 typedef
별도의 유형을 32 비트 부호없는 정수로 만들고 코드에서 새 유형을 사용하는 것입니다. 다른 C 구현에서 컴파일해야 할 때 typedef
s.
때로는 다루기 힘든 것을 volatile unsigned long
좀 더 컴팩트 한 것으로 줄이는 데 사용 됩니다 vuint32_t
.
다른 경우에는 같은 유형 int
이 각 플랫폼에서 항상 동일하지 않기 때문에 이식성에 도움이 됩니다. typedef를 사용하면 모든 소스 코드를 변경하지 않고도 관심있는 스토리지 클래스를 플랫폼의 가장 가까운 일치 항목으로 설정할 수 있습니다.
여기에는 여러 가지 이유가 있습니다. 내가 생각하는 것은 :
- Typename이 짧아 지므로 코드도 작아지고 읽기 쉬워집니다.
- 더 긴 구조 이름에 대한 앨리어싱 효과.
- 특정 팀 / 회사 / 스타일에 사용되는 규칙.
- 이식-모든 OS 및 컴퓨터에서 동일한 이름을 사용합니다. 기본 데이터 구조는 약간 다를 수 있습니다.
다음은 The C Programming Language (K & R)의 인용문입니다.
순수하게 미학적 문제 외에도 typedef를 사용하는 두 가지 주요 이유가 있습니다.
첫 번째-프로그램 매개 변수화
첫 번째는 이식성 문제에 대해 프로그램을 매개 변수화하는 것입니다. 기계에 종속 될 수있는 데이터 유형에 typedef가 사용되는 경우 프로그램이 이동 될 때 typedef 만 변경하면됩니다.
한 가지 일반적인 상황은 다양한 정수 수량에 대해 typedef 이름을 사용한 다음 각 호스트 시스템에 대해 short, int 및 long 중에서 적절한 세트를 선택하는 것입니다. 표준 라이브러리의 size_t 및 ptrdiff_t와 같은 유형이 예입니다.
기울임 꼴 부분은 프로그래머 typedef
가 이식성을위한 기본 유형 임을 알려줍니다 . 내 프로그램이 다른 컴파일러를 사용하여 다른 플랫폼에서 작동하는지 확인하려면 가능한 모든 방법으로 이식성을 보장하고 typedef
그중 하나가 되도록 노력할 것입니다.
Windows 플랫폼에서 Turbo C 컴파일러를 사용하여 프로그래밍을 시작했을 때 int
2 의 크기를 얻었습니다. Linux 플랫폼과 GCC 컴파일러로 옮겼을 때 얻은 크기는 4입니다. Turbo C를 사용하여 프로그램을 개발했다면 sizeof( int )
항상 2 인 주장 은 내 새 플랫폼으로 제대로 이식되지 않았을 것입니다.
도움이 되었기를 바랍니다.
K & R의 다음 인용문은 귀하의 질문과 관련이 없지만 완성을 위해 게시했습니다.
둘째-더 나은 문서 제공
typedef의 두 번째 목적은 프로그램에 대한 더 나은 문서를 제공하는 것입니다. 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,char
is a byte by definition. If your idea of "byte" is an octet, then eitherchar
is 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_t
should just be used directly. - Is the same as 4. Replace
uint32_t
withint16_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 typedef
s 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
and s16
are a bit too short, in my opinion. Also, it's kind of a bad thing to expose the names ulg
and uch
, one could prefix them with an application specific string since they obviously will not be exposed.
Hope this helps.
ReferenceURL : https://stackoverflow.com/questions/3340843/why-do-c-programmers-use-typedefs-to-rename-basic-types
'programing' 카테고리의 다른 글
typedef의 사용은 무엇입니까? (0) | 2021.01.11 |
---|---|
Nokogiri를 사용하여 속성에 액세스하는 방법 (0) | 2021.01.11 |
기본 Visual Studio 2010 및 2008 글꼴 (0) | 2021.01.11 |
IntelliJ IDEA 글로벌 검색 (0) | 2021.01.11 |
로그인 실패 후 리디렉션 고안 (0) | 2021.01.11 |