亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結構與結構定義

結構與結構定義

C C++
FFIVE 2019-06-03 14:58:57
結構與結構定義我是C編程的初學者,但我想知道使用typedef定義結構與不使用typedef..在我看來,這真的沒有什么區別,他們實現了同樣的目標。struct myStruct{     int one;     int two;};v.V.typedef struct{     int one;     int two;}myStruct;
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

常用的成語是同時使用:

typedef struct X { 
    int x; } X;

它們是不同的定義。為了使討論更清楚些,我將分兩句:

struct S { 
    int x; };typedef struct S S;

在第一行中,定義了標識符。S在struct名稱空間內(不是C+意義上的)。您可以使用它并定義新定義類型的變量或函數參數,方法是將參數的類型定義為struct S:

void f( struct S argument ); // struct is required here

第二行添加類型別名。S在全局名稱空間中,從而允許您只編寫:

void f( S argument ); // struct keyword no longer needed

注意,由于這兩個標識符名稱空間是不同的,所以定義S在結構和全局空間中都不是錯誤,因為它不是重新定義相同的標識符,而是在不同的位置創建不同的標識符。

為了使差別更清楚:

typedef struct S { 
    int x; } T;void S() { } // correct//void T() {} // error: symbol T already defined as an alias to 'struct S'

可以使用相同的結構名稱定義一個函數,因為標識符保存在不同的空格中,但不能定義與typedef當這些標識符碰撞時。

在C+中,由于定位符號的規則發生了微妙的變化,因此略有不同。C+仍然保留兩個不同的標識符空間,但與C中不同的是,當您只在類標識符空間中定義符號時,不需要提供struct/class關鍵字:

 // C++struct S { 
    int x; }; // S defined as a classvoid f( S a ); // correct: struct is optional

哪些更改是搜索規則,而不是定義標識符的位置。編譯器將搜索全局標識符表和之后。S還沒有找到它會搜索的S在類標識符中。

前面提出的代碼的行為方式相同:

typedef struct S { 
    int x; } T;void S() {} // correct [*]//void T() {} // error: symbol T already defined as an alias to 'struct S'

的定義之后,S函數的第二行中,編譯器不能自動解析結構S,要創建對象或定義該類型的參數,必須返回到包含struct關鍵詞:

// previous code here...int main() {
    S(); 
    struct S s;}


查看完整回答
反對 回復 2019-06-03
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

structtypedef是兩件完全不同的事。

這個struct關鍵字用于定義或引用結構類型。例如:

struct foo {
    int n;};

創建一個名為struct foo..名字foo標簽;只有在緊接struct關鍵字,因為標記和其他標識符是不同的。名稱空間..(這類似于C+的概念,但比C+的概念限制得多。)namespace(S.)

typedef盡管有名稱,但不定義新類型;它只是為現有類型創建一個新名稱。例如,鑒于:

typedef int my_int;

my_int的新名稱intmy_intint一點兒沒錯同樣的類型。類似地,考慮到struct以上定義,您可以寫:

typedef struct foo foo;

類型已經有了名字,struct foo..這個typedef聲明為同一類型提供了一個新名稱,foo.

語法允許您將structtypedef變成一份聲明:

typedef struct bar {
    int n;} bar;

這是一個常見的成語。現在,您可以將這種結構類型稱為struct bar或者就像bar.

請注意,直到聲明的末尾才能看到ty胡枝子的名稱。如果結構包含指向自身的指針,則必須使用struct供參考的版本:

typedef struct node {
    int data;
    struct node *next; /* can't use just "node *next" here */} node;

一些程序員將使用不同的標識符來表示struct標記和ty胡枝子名稱。在我看來,這是沒有好的理由的;使用相同的名字是完全合法的,并使他們更清楚地知道他們是相同的類型。如果必須使用不同的標識符,至少要使用一致的約定:

typedef struct node_s {
    /* ... */} node;

(就我個人而言,我寧愿省略typedef并將類型稱為struct bar..這個typedef節省一些輸入,但它隱藏了一個事實,即它是一種結構類型。如果您希望該類型是不透明的,這可能是一件好事。如果客戶端代碼將引用成員n從名字上講,它并不是不透明的;它顯然是一個結構,在我看來,把它稱為一個結構是有意義的。但是很多聰明的程序員在這一點上不同意我的觀點。要做好閱讀和理解任何一種方式編寫的代碼的準備。)

(C+有不同的規則。作出聲明struct blah,您可以將該類型稱為blah,即使沒有類型的胡枝子。如果你認為這是件好事的話,使用類型胡枝子可能會讓你的C代碼更像C+。)


查看完整回答
反對 回復 2019-06-03
  • 3 回答
  • 0 關注
  • 602 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號