關於C/C++中 Class, Struct, enum的定義聲明位置

 

struct 和 enum定義的數據類型的作用域是本文件中。所以:

a. 當一個struct的數據類型定義定義在.h文件中,.h文件被多個.c包含,這些.c文件又一起連接時,不會出現數據類型重複定義的錯誤。但是如果這個.h文件在同一個.c中被多次展開,就出現了數據類型重複定義的問題。

b. struct 數據類型的定義,應該定義在.h文件中。也可以定義在.c中,在.h中做聲明。

c. struct數據類型的定義和struct實例的定義是不同的,實例的定義的作用範圍是整個編譯對象。實例的定義一定要定義在.c中,如果外部有引用,在.h中作聲明。

 

下面是CSDN上的一個討論:

類,其實是數據類型的定義,和struct、enum的定義沒有區別,
1、類型定義和對象定義是有區別的:
類型定義的作用範圍和enum的定義是一樣,類似const對象的默認作用域,文件內部作用域,所以即使被多個.c文件包含進去也不會發生類類型重定義,除非被一個c文件多次展開,多次展開的情況才用#ifndef _H_ #define _H_頭文件哨兵避免,
但是非const對象定義就不同了,默認是extern作用域,所以被多個c文件包含就會發生對象重定義,用不用頭文件哨兵都一樣,這一點都沒有回答到。
2、class A 

  .... 
}; 
是類型定義,也同時進行了一個類型聲明,所以在很多書上直接說聲明一個類,稍微不嚴謹;
class A;纔是單純類型聲明,聲明只是說明一個名字在此處用到,所以可以重複聲明。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章