簡體   English   中英

C中的多個頭文件和函數原型

[英]Multiple Header Files and Function Prototypes in C

假設我在C中使用多個.c文件處理一個大型項目,是否有任何理由為什么我應該更喜歡使用多個頭文件而不是單個頭文件?

還有一個問題:

假設我有3個文件: header.hmain.cother.c
我有一個名為func()的函數,該函數僅在文件other.c定義和使用。 我應該將函數原型放置在頭文件中還是在other.c文件中?

  1. 多個標頭與單個標頭。

    使用多個標頭的主要原因是某些代碼可以獨立於其余代碼使用,並且該代碼可能應該具有自己的標頭。 在極端情況下,提供服務的每個源文件(或一小組源文件)都應具有自己的標頭,該標頭定義服務的接口。

    還要注意,標頭中包含使用模塊所需的信息-函數聲明所需的函數聲明和類型聲明(您沒有全局變量,對嗎?)。 標頭不應包括僅模塊實現所需的標頭。 它不應定義僅模塊實現所需的類型。 它不應定義不屬於模塊形式接口的功能(模塊內部使用的功能)。

    模塊中所有可以static都應該是static

    您可能在當前項目中仍具有一個綜合標題,其中包含全部或大部分或單獨的標題,但是如果您認為標題是定義模塊的接口,則您會發現大多數使用者模塊不需要了解所有可能的提供程序模塊。

  2. 函數func()僅在other.c使用,因此應將函數設為static以便僅在other.c可見。 除非其他文件使用該函數,否則不應將其放入標頭中-此時,將標頭放入標頭至關重要。

您可能會在其他問題中找到有用的信息,毫無疑問,還有許多其他問題也將有所幫助:

如果這是一個BIG項目,那么幾乎可以肯定,您必須擁有多個頭文件才能使您的項目變得明智。

我從事的項目有數千個源文件和數百個頭文件,總計幾百萬行。 您無法將所有這些頭文件放到一個文件中,並且無法進行任何有意義的工作。

頭文件應提供一種“功能性”。 因此,如果您有一個處理客戶帳戶,庫存,發票等的程序,則可能會有一個“ customer.h”,“ stock.h”和“ invoice.h”。 您可能還會有一個“ dateutils.h”,用於計算“何時需要支付該發票,以及自發出發票以來需要多長時間才能發出提醒。

通常,將頭文件保持為SMALL是一件好事。 如果一個頭文件需要另一個頭文件,則將其包括在內。

當然,如果未在特定文件外部使用函數,則不應將其放在頭文件中,並且為了避免“泄漏名稱”,它應為static 例如:

 static void func(int x)
 {
    return x * 2;
 }

如果由於某種原因需要轉發聲明func (因為在func之前需要調用func某些函數),則在源文件的開頭聲明它。 無需通過將其添加到頭文件來“擴展”。

通過將其標記為static ,您可以清楚地表明“在此文件之外,沒有其他人使用此功能”。 如果在稍后的階段發現“嗯,這個func在模塊B中也確實有用”,然后將其添加到合適的頭文件中(或創建一個新的頭文件),然后刪除static 現在,任何閱讀源文件的人都知道,他們將需要在此源文件之外進行檢查,以確保對func所做的任何更改在其余代碼中都可以。

通常,每個模塊都有一個頭文件來描述其接口,以明確分離關注點/可讀性/可重用性。

如果other.c中的函數是本地函數,則無需將其包含在頭文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM