2012-11-08 23 views
2

我的講師只是震驚,我要堅持,下面是一個有效的C++聲明:「struct type variablename」是否有效作爲聲明?

struct charlistrecord *next 

完整的條件是在C/C聲明遞歸數據類型++發現如下:

typedef struct charlistrecord 
{ 
    char data; 
    struct charlistrecord *next; 
} *charlist; 

我想知道是否有一段時間,這是被接受的語法,或者我是否已經愚蠢了幾個月,認爲我知道C++。

+5

放在結尾一個分號,它是完全有效的。 – WhozCraig

+1

是其有效.. –

+2

咩,而這可能是有效的,只有* C程序員做這個*。你不應該爲此感到難過。您的講師OTOH ... –

回答

2

此前C++和類型定義的假設下,得到一個類型的結構的唯一辦法是通過這種語法,這是獲得自我型連接節點唯一方式。

struct Foo 
{ 
    int val; 
    struct Foo *link; 
}; 

在C中,這需要的Foo的任何使用爲:

struct Foo foo; 
struct Foo *foo_ptr; 

等。

甲的typedef幫助此通過這樣做:

typedef struct Foo 
{ 
    int val; 
    struct Foo *link; 
} Foo; 

由於現在你可以這樣做:

Foo foo;  // same as struct Foo 
Foo *foo_ptr; // same as struct Foo * 

注意:使用typedef來別名struct Name並不侷限於Name作爲別名。喲是完全有效的做到這一點以及:

typedef struct Foo 
{ 
    int val; 
    struct Foo *link; 
} Bar; 

現在下面是可行的;

struct Foo foo; 
Bar bar; 
struct Foo *fooptr = &bar; 
Bar *barptr = &foo; 

真的讓你希望你在一天後在C中編程,不是嗎?可能沒有把事情弄清楚,但希望少一點灰色。

+0

呃謝謝,我不明白你說的意思,你說'自從你現在可以做這個'你是說,只有在以這種方式聲明typedef後,你才能說'Foo * foo;'? – rtuner

+0

@rtuner正是我所說的。沒有typedef,'Foo'必須以'struct'開頭。使用最後一個'} Foo;的typedef將它公開爲一個命名類型。順便說一句。它可能是除了Foo之外的東西;也是。我可以更新答案來證明,如果你想。 – WhozCraig

1

這是一個來自C的宿醉。在C中,這是你如何聲明結構變量和成員,所以它在C++中是合法的,因爲向後兼容。聽起來你的講師有點「老派」。

1

是的,它是完全有效的。這個詞struct這裏只是明確指出next是一個指向名爲charlistrecord一個結構類型。

這是C的回憶,你可能會遺漏C++中的關鍵字,但是如果你想使用它,你可以。

0

這是完全有效的,如果你的結構的名字是由可變陰影,喜歡這裏它甚至可以是有用的:

struct C {}; 
int C = 0; 
int a; 

void foo() { 
    C *a; // multiplies int C by int a 
    struct C *a; //defines 'a' as pointer to struct C 
} 
相關問題