第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

結(jié)構(gòu)與結(jié)構(gòu)定義

結(jié)構(gòu)與結(jié)構(gòu)定義

C C++
FFIVE 2019-06-03 14:58:57
結(jié)構(gòu)與結(jié)構(gòu)定義我是C編程的初學(xué)者,但我想知道使用typedef定義結(jié)構(gòu)與不使用typedef..在我看來,這真的沒有什么區(qū)別,他們實(shí)現(xiàn)了同樣的目標(biāo)。struct myStruct{     int one;     int two;};v.V.typedef struct{     int one;     int two;}myStruct;
查看完整描述

3 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個贊

常用的成語是同時使用:

typedef struct X { 
    int x; } X;

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

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

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

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

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

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

注意,由于這兩個標(biāo)識符名稱空間是不同的,所以定義S在結(jié)構(gòu)和全局空間中都不是錯誤,因?yàn)樗皇侵匦露x相同的標(biāo)識符,而是在不同的位置創(chuàng)建不同的標(biāo)識符。

為了使差別更清楚:

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

可以使用相同的結(jié)構(gòu)名稱定義一個函數(shù),因?yàn)闃?biāo)識符保存在不同的空格中,但不能定義與typedef當(dāng)這些標(biāo)識符碰撞時。

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

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

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

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

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

的定義之后,S函數(shù)的第二行中,編譯器不能自動解析結(jié)構(gòu)S,要創(chuàng)建對象或定義該類型的參數(shù),必須返回到包含struct關(guān)鍵詞:

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


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

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個贊

structtypedef是兩件完全不同的事。

這個struct關(guān)鍵字用于定義或引用結(jié)構(gòu)類型。例如:

struct foo {
    int n;};

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

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

typedef int my_int;

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

typedef struct foo foo;

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

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

typedef struct bar {
    int n;} bar;

這是一個常見的成語?,F(xiàn)在,您可以將這種結(jié)構(gòu)類型稱為struct bar或者就像bar.

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

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

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

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

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

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


查看完整回答
反對 回復(fù) 2019-06-03
  • 3 回答
  • 0 關(guān)注
  • 597 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號