2016-12-06 63 views
1

的目的,我學習structtypedef和我完全新的編碼是什麼類型名字* aliasname的

typedef struct 
{ 
    uint8_t ID; 
    uint8_t TanID; 
    uint8_t ProductID; 
    uint8_t SetlTme; 
    uint8_t NoOfStep 
}product_Config; 

typedef product_Config *product_Config_Ptr; 

我沒有得到什麼是最後一行是爲

typedef product_Config *product_Config_Ptr;

+3

不妨將它想象爲'typedef Tank_Config * Tank_Config_Ptr'。基本上只是一個新的指針類型。 – Iluvatar

+0

我覺得最後的typedef是不好的味道。當某種類型是指針時,你想立刻知道。但是YMMV。 –

回答

3

A typedef定義了一個類型的別名。

在您的示例中typedef Tank_Config *Tank_Config_Ptr;聲明Tank_Config_Ptr作爲Tank_Config *的別名。

所以下面的定義是等價的。

Tank_Config *ptr1; 
Tank_Config_Ptr ptr2; 

話雖這麼說,它被認爲是不好的做法,隱藏typedef內的指針。它掩蓋了一個事實,即指針正在被使用,並可能導致代碼讀者混淆。

1

這是一個typedef;它允許程序員在隨後的代碼中寫Tank_Config_Ptr來代替Tank_Config *,假設Tank_Config已經被定義爲一個類型。

這樣的名字幾乎沒有什麼好處,除非你有一些困難,使得難以編寫或讀取*字符。

在第一個示例中,它允許product_Config代替struct { uint8_t ID; uint8_t TanID; uint8_t ProductID; uint8_t SetlTme; uint8_t NoOfStep}。這是一件好事。

0

接下來的兩個字符串做同樣的:

  1. Tank_Config * tank_config_ptr; 
    
  2. Tank_Config_Ptr tank_config_ptr; 
    
1

可能使用的typedef定義指針類型的最顯著的優點是,它允許一個常見的類型是爲聲明中的多個變量指定。如果一個人想兩個指針到Tank_Config和不具有指針的類型定義,一個要麼必須寫:

Tank_Config *first, *last; 

否則

Tank_Config *first; 
Tank_Config *last; 

爲每個變量之前,包括星號名稱而不是能夠使用:

Tank_Config_Ptr first, last; 

而不必指定星號。一個相關的優點是它避免了與初始化語句的語法不一致性。如果FOO()是一個返回Tank_Config,包括初始化看起來像一個指針的聲明中的功能:

Tank_Config *myPointer = foo(); // Note the asterisk is needed here... 

但隨後的分配將是這樣的:

myPointer = foo(); // ...but not here! 

如果一個人利用了類型的typedef表單,代碼將如下所示:

Tank_Config_Ptr myPointer = foo(); // No asterisk here or in assignment 

它使用與後續分配相同的語法。在C中使用

+0

*最顯着的優點*:我害怕不同,隱藏在typedefs背後的指針實際上非常容易出錯,並導致代碼混淆。 – chqrlie

+0

@chqrlie:在typedef後面隱藏指針的好壞取決於它們是更多地用作指向事物的指針還是用作指針的抽象事物。例如,我認爲''中的'FILE'類型會更適合作爲指針,因爲用戶代碼不需要關心它是否指向結構的指針,指向聯合的指針,指向指針的指針,指向數組的指針,指向表的索引或其他任何東西。說'FILE f1,f2;'似乎比說'FILE * f1,* f2;'更自然。 – supercat

+0

這是正確的,但在OP的情況下,typedef指針引起了混淆,對於新手來說,這種問題似乎是相當系統的。經常引發這種建設的老師並沒有幫助他們的學生。 – chqrlie

2

typedef用於定義新的數據類型。這些新的數據類型通常只是現有數據類型,結構或聯合的別名。它主要用於定義在代碼上下文中更有意義的類型。例如,size_t在C的標準類型可以像這樣(如在註釋中指出chqrlie實際定義可以在不同的平臺和實現而異)

typedef unsigned int size_t; 

所以,當你需要一個變量被定義它表示某個對象的大小或長度,因此將其聲明爲size_t的類型,這使得變量的意圖更清晰地呈現給讀者。

使用typedef的簡化形式如下

typedef <some existing datatype or struct> <your_new_type> 

(但可以比這更復雜,也不會總是適合這種形式。例如,如果你正在嘗試的typedef函數指針)

在您的例子:

typedef Tank_Config *Tank_Config_Ptr; 

你是說Tank_Config_Ptr是一種新型的是該類型別名

+0

*'size_t'是C中的一個常見類型,它的定義如下*:'size_t'是一個標準C類型,可以在許多平臺上進行不同的定義。 – chqrlie

+0

@chqrlie謝謝,我已澄清。 –

+0

您的語法定義是一種簡化,因爲聲明的類型名稱不一定在聲明的末尾,它比聲明變量時多。例如'typedef void(* sighandler_t)(int);'。我不指望你解釋整個'typedef',但我想你應該提到這只是最簡單的形式。 –