2009-10-25 4 views
1

C의 표준 유형에 대한 typedef에 대한 권장 접근 방식은 무엇입니까?C의 표준 유형에 대한 typedef에 대한 권장 접근법은 무엇입니까?

예를 들어 프로젝트 시작시 가능한 가장 작은 유형의 typedef를 만들었습니다. 주된 의도는 전체 프로젝트에서 전역 검색 + 바꾸기를 수행하지 않고도 사용 된 숫자 범위가 유형에 비해 너무 큰 경우 유형을 쉽게 수정할 수 있도록하는 것이 었습니다. 그러나 6 개월 후 나는 만족스럽지 않고 더 나은 방법이 있어야한다고 생각한다.

이 내가 정의한 유형은 다음과 같습니다 덜 T_MAX 내가 '하지만 max_val이 어디

/* type to be used for storing map data within 
    n*n array         */ 
typedef unsigned char map_t; 

/* type to be used for storing coordinates in map. 
    min 0,max 32 (MAP_W,MAP_H defaults). note: no 
    longer requires signed.      */ 
typedef unsigned char xy_t; 

/* type to be used for counters, ie moves_remaining 
    has max 2000        */ 
typedef signed int ctr_t; 

/* type to be used for storing the level number, 
    requires signed.       */ 
typedef signed short lvl_t; 

/* type to be used for storing contact types, 
    see actions.h CONTACT      */ 
typedef signed short ct_t; 

/* small unsigned type, miscellaneous   */ 
typedef unsigned char su_t; 

/* small signed type, miscellaneous   */ 
typedef signed char ss_t; 

struct xy 
{ 
    xy_t x; 
    xy_t y; 
}; 

struct scrxy 
{ 
    int x; 
    int y; 
}; 

struct xy_offset 
{ 
    ss_t x; 
    ss_t y; 
}; 

대신 서명 유형을 사용하고 n < 0 && n > max_val에 대한 검사의 일부 코드는 부호없는 형식과 n > max_val에 대해서만 검사를 사용 이 동작은 실제로 정의되지 않았 음을 알게 된 이후로

typedef을 모두 제거하고 내 코드 전체에서 stdint.h에 정의 된 표준 유형을 사용해야하나요? (크기가 현재 상당히 안정되었습니다)?

+0

당신이 "발견이 동작은 실제로 정의되지 않은 때문에"당신이 말할 때 참조 무엇 http://groups.google.com/group/comp.compilers/msg/c0797b5b668605b4?pli=1 – adatapost

+0

에서보세요 ? – caf

+0

@caf : 부호없는 저장소 유형에 -1을 할당하면 결과가 해당 형식의 최대 값이되는 경우가 많지만 C 표준에 정의되어 있지 않으므로 보장되지 않습니다. –

답변

2
  • 컴파일러가 이미 지원하지 않으면 <stdint.h> 버전을 찾거나 생성하십시오.
  • 그 후에 가능하면 크기가 아닌 사용법에 따라 데이터 형식에 대해 typedef을 만드는 것이 좋습니다. 데이터 유형 크기 (ss_t)와 사용법 (lvl_t)이 혼합 된 것 같습니다. 이것은 프로그래머가 임의로 하나를 선택하거나 가장 쉽게 찾을 수있는 것을 선택하기 때문에 문제가되는 경향이 있습니다.
  • 끝 부분에서 "_t"을 제거하십시오. _t으로 끝나는 글로벌 식별자는 다른 시퀀스의 호스트와 함께 POSIX에 의해 예약됩니다.
+4

'_t' 접미사는 POSIX에 의해 예약됩니다. 그것은 ANSI 나 ISO가 아닙니다. –

+0

@ Adam : 감사합니다 ... ISO 사본을 찾지 못한 이유가 여기에 있습니다. 반드시 POSIX Programmer 's Guide에서 읽어야합니다. –

3

개인적으로 stdint.h 유형의 측면에서 모든 max_t 등 유형의 형식 정의를 다음과 같습니다

는 별도로이 "기타"유형의
typedef uint8_t map_t; 

, 나는 유사한 접근 자신을 사용하십시오 - 모든 컴파일러 경고와 함께하고 정수 변환 및 비교에 관한 오류가 사용되었습니다.

은 당신이 에이다을 : 당신이 더 정확한 유형 정의를하려면 프로그래밍 언어 전환 사용해야합니다 생각

+1

Ada를 언급 한 +1 ... 제한된 유형이 있습니다. –

0

당신에게 내 조언은 그들이 당신이 한있는 그대로의 형식 정의를 유지해야한다는 것입니다 일관되게 사용됩니다. 이러한 typedef를 사용하면 앞으로 프로그램을 리팩터링하는 데 큰 도움이 될 수 있습니다.

관련 문제