?? 編程規范與范例(2).txt
字號:
typedef struct STUDENT_STRU
{
unsigned char name[8]; /* student's name */
unsigned char age; /* student's age */
unsigned char sex; /* student's sex, as follows */
/* 0 - FEMALE; 1 - MALE */
unsigned char
teacher_name[8]; /* the student teacher's name */
unisgned char
teacher_sex; /* his teacher sex */
} STUDENT;
若改為如下,可能更合理些。
typedef struct TEACHER_STRU
{
unsigned char name[8]; /* teacher name */
unisgned char sex; /* teacher sex, as follows */
/* 0 - FEMALE; 1 - MALE */
} TEACHER;
typedef struct STUDENT_STRU
{
unsigned char name[8]; /* student's name */
unsigned char age; /* student's age */
unsigned char sex; /* student's sex, as follows */
/* 0 - FEMALE; 1 - MALE */
unsigned int teacher_ind; /* his teacher index */
} STUDENT;
½ 5-4:不要設計面面俱到、非常靈活的數據結構。
說明:面面俱到、靈活的數據結構反而容易引起誤解和操作困難。
½ 5-5:不同結構間的關系不要過于復雜。
說明:若兩個結構間關系較復雜、密切,那么應合為一個結構。
示例:如下兩個結構的構造不合理。
typedef struct PERSON_ONE_STRU
{
unsigned char name[8];
unsigned char addr[40];
unsigned char sex;
unsigned char city[15];
} PERSON_ONE;
typedef struct PERSON_TWO_STRU
{
unsigned char name[8];
unsigned char age;
unsigned char tel;
} PERSON_TWO;
由于兩個結構都是描述同一事物的,那么不如合成一個結構。
typedef struct PERSON_STRU
{
unsigned char name[8];
unsigned char age;
unsigned char sex;
unsigned char addr[40];
unsigned char city[15];
unsigned char tel;
} PERSON;
½ 5-6:結構中元素的個數應適中。若結構中元素個數過多可考慮依據某種原則把元素組成不同的子結構,以減少原結構中元素的個數。
說明:增加結構的可理解性、可操作性和可維護性。
示例:假如認為如上的_PERSON結構元素過多,那么可如下對之劃分。
typedef struct PERSON_BASE_INFO_STRU
{
unsigned char name[8];
unsigned char age;
unsigned char sex;
} PERSON_BASE_INFO;
typedef struct PERSON_ADDRESS_STRU
{
unsigned char addr[40];
unsigned char city[15];
unsigned char tel;
} PERSON_ADDRESS;
typedef struct PERSON_STRU
{
PERSON_BASE_INFO person_base;
PERSON_ADDRESS person_addr;
} PERSON;
½ 5-7:仔細設計結構中元素的布局與排列順序,使結構容易理解、節省占用空間,并減少引起誤用現象。
說明:合理排列結構中元素順序,可節省空間并增加可理解性。
示例:如下結構中的位域排列,將占較大空間,可讀性也稍差。
typedef struct EXAMPLE_STRU
{
unsigned int valid: 1;
PERSON person;
unsigned int set_flg: 1;
} EXAMPLE;
若改成如下形式,不僅可節省1字節空間,可讀性也變好了。
typedef struct EXAMPLE_STRU
{
unsigned int valid: 1;
unsigned int set_flg: 1;
PERSON person ;
} EXAMPLE;
½ 5-8:結構的設計要盡量考慮向前兼容和以后的版本升級,并為某些未來可能的應用保留余地(如預留一些空間等)。
說明:軟件向前兼容的特性,是軟件產品是否成功的重要標志之一。如果要想使產品具有較好的前向兼容,那么在產品設計之初就應為以后版本升級保留一定余地,并且在產品升級時必須考慮前一版本的各種特性。
½ 5-9:留心具體語言及編譯器處理不同數據類型的原則及有關細節。
說明:如在C語言中,static局部變量將在內存“數據區”中生成,而非static局部變量將在“堆棧”中生成。這些細節對程序質量的保證非常重要。
½ 5-10:編程時,要注意數據類型的強制轉換。
說明:當進行數據類型強制轉換時,其數據的意義、轉換后的取值等都有可能發生變化,而這些細節若考慮不周,就很有可能留下隱患。
½ 5-11:對編譯系統默認的數據類型轉換,也要有充分的認識。
示例:如下賦值,多數編譯器不產生告警,但值的含義還是稍有變化。
char chr;
unsigned short int exam;
chr = -1;
exam = chr; // 編譯器不產生告警,此時exam為0xFFFF。
½ 5-12:盡量減少沒有必要的數據類型默認轉換與強制轉換。
½ 5-13:合理地設計數據并使用自定義數據類型,避免數據間進行不必要的類型轉換。
½ 5-14:對自定義數據類型進行恰當命名,使它成為自描述性的,以提高代碼可讀性。注意其命名方式在同一產品中的統一。
說明:使用自定義類型,可以彌補編程語言提供類型少、信息量不足的缺點,并能使程序清晰、簡潔。
示例:可參考如下方式聲明自定義數據類型。
下面的聲明可使數據類型的使用簡潔、明了。
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
下面的聲明可使數據類型具有更豐富的含義。
typedef float DISTANCE;
typedef float SCORE;
½ 5-15:當聲明用于分布式環境或不同CPU間通信環境的數據結構時,必須考慮機器的字節順序、使用的位域及字節對齊等問題 。
說明:比如Intel CPU與68360 CPU,在處理位域及整數時,其在內存存放的“順序”正好相反。
示例:假如有如下短整數及結構。
unsigned short int exam;
typedef struct EXAM_BIT_STRU
{ /* Intel 68360 */
unsigned int A1: 1; /* bit 0 7 */
unsigned int A2: 1; /* bit 1 6 */
unsigned int A3: 1; /* bit 2 5 */
} EXAM_BIT;
如下是Intel CPU生成短整數及位域的方式。
內存: 0 1 2 ... (從低到高,以字節為單位)
exam exam低字節 exam高字節
內存: 0 bit 1 bit 2 bit ... (字節的各“位”)
EXAM_BIT A1 A2 A3
如下是68360 CPU生成短整數及位域的方式。
內存: 0 1 2 ... (從低到高,以字節為單位)
exam exam高字節 exam低字節
內存: 7 bit 6 bit 5 bit ... (字節的各“位”)
EXAM_BIT A1 A2 A3
說明:在對齊方式下,CPU的運行效率要快得多。
示例:如下圖,當一個long型數(如圖中long1)在內存中的位置正好與內存的字邊界對齊時,CPU存取這個數只需訪問一次內存,而當一個long型數(如圖中的long2)在內存中的位置跨越了字邊界時,CPU存取這個數就需要多次訪問內存,如i960cx訪問這樣的數需讀內存三次(一個BYTE、一個SHORT、一個BYTE,由CPU的微代碼執行,對軟件透明),所有對齊方式下CPU的運行效率明顯快多了。
1 8 16 24 32
------- ------- ------- -------
| long1 | long1 | long1 | long1 |
------- ------- ------- -------
| | | | long2 |
------- ------- ------- --------
| long2 | long2 | long2 | |
------- ------- ------- --------
| ....
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -