正如其他人指出,一個頭foo.h中應申報需要的信息能夠使用由源文件foo.c提供的設施。這將包括foo.c提供的類型,枚舉和函數。 (你不使用全局變量,是嗎?如果你這樣做了,那麼這些變量也是在foo.h中聲明的。)
頭文件foo.h應該是自包含的和冪等的。獨立意味着任何用戶都可以包含foo.h,而不必擔心可能需要哪些其他頭文件(因爲foo.h包含這些頭文件)。冪等性意味着如果標題包含多次,則不會造成任何損害。這是經典的技術來實現:
#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
...rest of the contents of foo.h...
#endif /* FOO_H_INCLUDED */
問題問:
foo.c文件裏包含了foo.h,它包含了所有的foo.c聲明; bar.c和bar.h也一樣。 foo.c中的函數foo1()調用bar1(),它在bar.h中聲明並在bar.c中定義。現在的問題是,我應該在foo.h中還是在foo.c中包含bar.h?
這取決於foo.h提供的服務是否依賴於bar.h。如果使用foo.h的其他文件需要bar.h定義的類型或枚舉之一以使用foo.h的功能,那麼foo.h應確保包含bar.h(通過包含它)。但是,如果bar.h的服務僅在foo.c中使用,並且使用foo.h的用戶不需要,則foo.h不應包含bar.h
創建標頭的唯一原因是因爲多個源文件需要這些信息。在foo.h之外不應該需要foo_int.h頭文件,所以不應該創建或使用它 - 它的內容可以直接放在foo.c文件中。 – 2008-11-09 21:16:00
繼續:當您有多個提供'foo.c'功能的源文件 - 比如說foo1.c和foo2.c時,您可以使用foo_int.h。那麼內部頭文件是有意義的。但是,您應該致力於保持足夠的緊湊性,以免C文件分割變得不必要。 – 2008-11-09 21:17:11