2009-05-13 1 views
2

그럼 난 일부 Java하고 있어요 - 유형 매핑을 사용하는 werid C 통합 및 축복하는 C 라이브러리 (그 중 프로그래머 더;)) :내장 유형에 typedef (또는 #define) 사용 - 현명한 이유는 무엇입니까?

#define CHAR  char     /* 8 bit signed int   */ 
#define SHORT  short     /* 16 bit signed int   */ 
#define INT   int      /* "natural" length signed int */ 
#define LONG  long     /* 32 bit signed int   */ 
typedef unsigned char BYTE;   /* 8 bit unsigned int   */ 
typedef unsigned char UCHAR;   /* 8 bit unsigned int   */ 
typedef unsigned short USHORT;   /* 16 bit unsigned int   */ 
typedef unsigned int  UINT;   /* "natural" length unsigned int*/ 

을 사용하지 않는 합법적 인 이유가 있습니까? char이 곧 다시 정의 될 것 같지 않습니다.

내가 생각할 수있는

:

  1. 쓰기 플랫폼/컴파일러 휴대용 코드 (유형의 크기는 C/C++에 underspecified됩니다)
  2. 저장 공간 및 임베디드 시스템에 대한 시간 - 짧은 배열을 통해 당신은 루프의 경우 255bit 이상의 8bit 마이크로 프로세서 작성 :

    for(uint8_t ii = 0; ii < len; ii++) 
    

    은 빠른 속도 향상을 제공합니다.

답변

2

C 표준은 정수 유형의 수를 지정하지 않습니다. 그것은 컴파일러와 코드가 실행될 프로세서에 달려 있습니다.

따라서 최대의 휴대 성을 위해 각 유형이 특정 대상에 얼마나 큰지를 나타내는 표준 이름을 사용하는 헤더를 갖는 것이 가장 좋습니다.

MISRA-C 및 기타는 uint16_t, sint32_t 등을 사용합니다. u16, s32도 사용 중입니다.

#define 관련 v typedef : typedef를 사용하여 컴파일러가 유형을 확인합니다.

+0

uint16_t와 관련하여 - 저는 대학에서 마이크로 프로 세 서 프로그래밍을 할 때만 사용했지만, 공간/메모리를 절약하기 위해 명시 적으로 사용했습니다. 거의 255 바이트 (거의 전부였습니다)의 배열을 반복 할 때처럼 uint8_t (마이크로 프로세서는 8 비트입니다). 그리고 휴대 성을 위해 –

+0

실제로; 그들은 그 목적에도 봉사한다. –

4

이것이 바로 그 이유입니다. C는 여러 시스템에서 사용되며 실제로 유형 크기가 실제로 플랫폼/하드웨어/버전간에 얼마나 자주 변경되는지 방해합니다.

+1

하지만 stdint.h (http://www.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html)는이를 훨씬 간단하고 간단하게 수행 할 수있는 방법을 제공합니다. –

+0

나는 그것이 이상적이라고 말하지 않고 왜 그것이 이루어 졌는지 설명하고있다. 명심하십시오, 이것은 20 년 이상 된 오래된 결정입니다. 그 당시에는 크기가 훨씬 더 큰 요소라고 상상해 보셨습니까? 아니면 간단하게 실수로 만들 수 있었을까요? 누가 압니까? – Serapth

+0

stdint.h는 C99에만 있습니다. 모든 컴파일러가 제공하는 것은 아닙니다. –

1

당신이 더 .. 이들 중 일부는 INT32 및 INT64처럼해야 기본적으로

INT는 표준 사이즈가 없습니다가 말했다 아니라. 32 비트 또는 64 비트가 허용됩니다.

위의 선언을 사용하면 INT32가 항상 32 비트 정수를 제공한다는 안전한 가정을 할 수있는 휴대용 코드를 작성하는 데 도움이됩니다.

+0

휴대용 32 비트 정수형을 원하면 int32_t (http://linux.die.net/man/3/int32_t)를 사용하십시오. 제 의견으로는 INT와 같은 정의는 보통 무의미합니다. –

0

운영 체제 전반의 이식성뿐만 아니라 32 비트 및 64 비트 컴퓨터와 같은 아키텍처 전반에서도 이식 가능합니다.

64 비트 비트 플래그를 저장하기 위해 2 개의 부호없는 정수를 사용하는 32 비트 시스템에 네트워크 코드를 작성했다고 가정 해보십시오. 64 비트 컴퓨터에서 같은 코드를 컴파일하면 대부분의 64 비트 컴퓨터가 int에 대해 8 바이트를 할당하므로 실제로는 128 비트가 할당되고 32 비트가 할당됩니다 두 세트의 32 비트 플래그. 그것은 분명히 이식성에있어서 정말로 나쁜 것입니다.

많은 경우, uint16_t 및 uint32_t와 같이 해당 변수에 할당 된 메모리의 크기를 구체적으로 나타내는 typedef가 표시됩니다. 그런 다음 유형에 관계없이 유형에 상관없이 특정 아키텍처에서 서명되지 않은 저장소를 typedef하므로 운영 체제 및 아키텍처 전반에서 코드가 일관성을 유지할 수 있습니다.

1

Q : typedefs 또는 #defines?

A : 정의는 전처리 지시어이지만 typedef는 실제로 컴파일러에서 수행하는 작업입니다. 개인적으로 타입 정의에 typedef를 사용하고 상수 및 함수 래퍼 등을 정의하는 것이 더 좋습니다.

관련 문제