2012-07-08 76 views
8

我有一個頭文件中聲明如下:typedef帶前向聲明副作用?

struct my_struct; 
int func(struct my_struct* s);  // Passing struct my_struct* 

沒有提前聲明,編譯器會明顯給this error

error: 'struct my_struct' declared inside parameter list

但是,如果我更換用typedef前向聲明my_struct,並相應更新函數聲明,它compiles fine

typedef struct my_struct my_struct_t; 
int func(mystruct_t* s);    // Passing my_struct_t* 

奇怪的是,如果我繼續typedef的,但使用原來的聲明my_struct,它also compiles

typedef struct my_struct my_struct_t; 
int func(struct my_struct* s);  // Passing struct my_struct* 

別的任何人察覺到嗎?這種行爲是否是一種副作用?

+2

typedef也充當前向聲明,它將類型名稱帶入作用域。 – 2012-07-08 13:18:02

+0

@DanielFischer是的,我注意到了,但我找不到標準中的任何內容。我錯過了什麼? – 2012-07-08 13:19:15

+0

不需要前向聲明來創建指向結構的指針。這只是一個約定。我錯了嗎? – 2012-07-08 13:31:22

回答

7

6.2.1節,第7段:

結構,聯合和枚舉標籤有作用域只是 在聲明標籤的類型SPECI網絡呃標籤出現之後開始。每個枚舉常量的範圍是 在枚舉器列表中定義的枚舉器出現後開始。任何 其他標識符的範圍都是在其聲明完成後開始的。

而在6.7.2.3,第8段:

如果表單的類型SPECI音響ER 結構-或癒合identi音響ER 發生不是作爲上述形式之一,的一部分的其它無 標識符的其他聲明是可見的,然後它聲明不完整的結構體或聯合體類型,並且 將標識符聲明爲該類型的標籤。

typedef因此聲明不完整的結構類型。

+0

+1漂亮!非常感謝! – 2012-07-08 13:55:13