我需要一些幫助來理解這種結構:需要幫助瞭解結構用C
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
隨着typedef
我知道,我可以用我的代碼編寫struct std_fifo
只std_fifo
代替。但是*fifo
呢?
我需要一些幫助來理解這種結構:需要幫助瞭解結構用C
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
隨着typedef
我知道,我可以用我的代碼編寫struct std_fifo
只std_fifo
代替。但是*fifo
呢?
代碼
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
創建兩個(非常嚴重命名)typedef名稱,std_fifo
和fifo
。
typedef名std_fifo
相當於類型struct std_fifo
,並且可以代替struct std_fifo
使用:
std_fifo fifo_instance; // creates an instance of struct std_fifo
std_fifo get_fifo(); // declares get_fifo as a function returning an
// instance of struct std_fifo
void read_fifo(std_fifo *);// declares a function taking parameter of type
// pointer to struct std_fifo
typedef名fifo
相當於類型struct std_fifo *
,並且可以代替struct std_fifo *
使用:
fifo fifo_ptr; // creates a pointer to an instance of struct std_fifo
fifo get_fifoptr(); // declares get_fifoptr as a function returning a pointer
// to an instance of struct std_fifo
void read_fifo(fifo); // declares a function taking a parameter of type
// struct std_fifo *
的原因代碼像
typdef struct std_fifo { ... } std_fifo;
作品是因爲C有四個不同的名字空間標識符:標籤,標籤名稱,struct
和union
成員名稱,以及其他一切。 標籤名稱std_fifo
總是在struct
關鍵字之前,這是編譯器將其與std_fifo
typedef名稱區分開來的方式。
使用的typedef幾點建議:
雖然它們可以幫助你的代碼掃描更好的在某些情況下,使用的typedef實際上可以掩蓋你的意圖,使各類更難使用。如果類型的用戶必須知道其表示(例如訪問struct
的成員,或取消引用指針類型,或者在printf
或scanf
調用中使用正確的轉換說明符,或者調用函數propertyly等),那麼你應該而不是隱藏在一個typedef後面的表示。
如果您決定使用做想要隱藏typedef後面的類型表示,那麼您還應該爲涉及該類型的任何操作提供完整的API。 C使用FILE
類型執行此操作;不是直接操縱對象,而是將指針傳遞給各個例程。所以,如果你決定要隱藏struct std_fifo *
typedef名fifo
後面,那麼你也應該創建一個API,如:
fifo new_fifo(); // create a new fifo queue
void destroy_fifo(fifo *); // destroy an existing fifo queue
set_name(fifo, const char *); // set the name of a fifo element
char *get_name(fifo); // retrieve the name of a fifo element
fifo push_fifo(fifo); // add an element to the end of the queue
fifo pop_fifo(fifo); // remove an element from the front of the queue
抽象可以是一件好事,但「漏」抽象是比沒有抽象的更糟所有。
這是一個結構的有效定義,可以給一個名稱和一個指針。
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
在這個代碼,其中std_fifo
是一個結構和*fifo
是指針這個結構。
請注意,'std_fifo'是結構類型的類型名稱的別名,'fifo'是指向相同結構類型的指針類型的別名。你的評論使它看起來有點像你認爲它們是變量。如果你用'static'或'extern'替換了存儲類'typedef',那麼片段確實會定義或聲明一對變量。使用'typedef'的'存儲類',它定義了'struct std_fifo'類型的別名。 –
是的,我已經告訴它,它是一個**結構**。我沒有說它是結構變量名稱或任何其他事物的名稱?好的。@JonathanLeffler – Prometheus
好的。我會把它留在「我發現你的語言不明確」,但你知道你的意思。 –
這意味着您可以使用'fifo variablename;'而不是'struct std_fifo * variablename;'或'std_fifo * variablename;'來聲明指向結構體的指針。 – mch
所以我可以寫'fifo variablename;'或'std_fifo * variablename;' ?它是一樣的嗎? – iAmoric
請參閱[是否是一個好主意typedef指針](http://stackoverflow.com/questions/750178/is-it-a-good-idea-to-typedef-pointers) - 簡潔的答案:No. –