2009-10-25 66 views
1

對於C中標準類型的typedefs,推薦使用什麼方法?在C中爲標準類型提供typedefs的推薦方法?

例如,在我的項目開始時,我創建了typedefs,以便爲其目的使用最小的類型。主要目的是在不需要在整個項目中進行全局搜索+替換的情況下,對所使用的數值範圍變得太大而無法輕鬆修改類型。但六個月後,我並不滿意,認爲必須有更好的方法。

這些是我所定義的類型:

/* 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檢查其中max_val是少的T_MAX雖然我自從發現這種行爲實際上是未定義的。

我應該刪除所有這些typedef s,並使用stdint.h中定義的標準類型代替整個代碼(現在尺寸現在穩定得相當好)?

+0

查看http://groups.google.com/group/comp.compilers/msg/c0797b5b668605b4?pli=1 – adatapost 2009-10-25 11:25:26

+0

當你說「自發現此行爲實際上未定義」時,你指的是什麼? ? – caf 2009-10-25 21:05:10

+0

@caf:儘管將-1分配給無符號存儲類型的結果通常會導致該類型的最大值,但此行爲不是由C標準定義的,因此無法保證。 – 2009-10-25 21:27:48

回答

2
  • 如果您的編譯器不支持它,請從查找或創建<stdint.h>版本開始。
  • 之後,我會建議創建typedef s數據類型的基礎上,而不是他們的大小,如果可能的話。您似乎有數據類型大小(ss_t)和用法(lvl_t)的混合。這往往會成爲問題,因爲程序員會隨意選擇一個或另一個,或選擇他們覺得最容易輸入的那個。
  • 從最後刪除「_t」。以_t結尾的全局標識符由POSIX和其他一系列序列保留。
+4

'_t'後綴由POSIX保留;它不是ANSI或ISO。 – 2009-10-25 12:28:45

+0

@亞當:謝謝......我想這就是爲什麼我無法在我的ISO副本中找到它的原因。必須在POSIX程序員指南中閱讀它。 – 2009-10-26 01:16:21

3

我個人的typedef所有這些max_t等類型stdint.h類型的術語:

typedef uint8_t map_t; 

除了兩個「雜」的類型,我會使用類似的方法我自己 - 所有的編譯器警告和有關整數轉換和比較啓用的錯誤。

我想你需要切換編程語言,如果你想更精確的類型定義和使用阿達:)

+1

提及阿達的+1 ...我想念受約束的類型。 – 2009-10-25 12:14:17

0

我給你的建議是你應該保持的typedef,因爲他們,只要他們是一貫使用。擁有這些類型定義可能會在將來重構您的程序方面提供很大的幫助。

相關問題