2010-05-26 57 views
9

我有一個C/C++的問題,我可以重複使用不同的對象文件或項目的功能,而無需兩次寫入函數頭? (一個用於定義函數,另一個用於聲明它)不寫函數頭兩次的方法?

我對C/C++,Delphi和D瞭解不多。我假設在Delphi或D中,只需編寫一次函數需要的參數,那麼你可以在不同的項目中使用該功能。 而在C中,你需要在頭文件*中的函數聲明再次??,對吧?有沒有一個好的工具可以從C源創建頭文件?我有一個,但它不是預處理器意識,不是很嚴格。我有一些宏觀技術,工作相當糟糕。

我找這裏所描述的方式在C/C++編程像http://www.digitalmars.com/d/1.0/pretod.html

+1

我不知道D是如何在這個領域工作的,但是在Delphi中如果你正在編寫一個包含將被其他單元和程序調用的例程的單元,那麼你必須編寫過程和函數聲明兩次,一次接口部分,然後再次在實現部分中的實際例程。 Delphi IDE提供了一些幫助,但最終取決於程序員確保它們保持同步。當編譯器不同步時,它肯定會通知您。要保持這一點並不難,這是程序員知道代碼在做什麼的一部分工作。 – Todd 2010-05-26 14:11:33

+0

'D'比C++更接近Java或C#。 – egrunin 2010-05-26 14:22:56

回答

11

恕我直言,從源頭產生的頭是一個壞主意,是不現實的。

標題可以包含更多信息,只是函數名稱和參數。

下面是一些例子:

  • 一個C++報頭可以定義一個抽象類其中源文件可以是不需要的
  • 模板可以只在頭文件
  • 默認被定義參數僅在類定義中指定(因此在頭文件中)

您通常會爲您寫信r頭,然後將實現寫入相應的源文件中。

我認爲做另一種方式是違反直覺,不符合CC++的精神。

唯一的例外是可以看到的是靜態功能。一個靜態函數只出現在其源文件(.c.cpp)中,並且不能(顯然)在其他地方使用。

儘管我同意將方法/函數的頭文件定義複製到源文件通常很煩人,但您也可以配置代碼編輯器來緩解這種情況。我使用Vim和一個快速腳本幫助我處理了這個很多。我想大多數其他編輯器都有類似的解決方案。

無論如何,雖然這看起來很煩人,但請記住它也提供了更大的靈活性。您可以分發頭文件(.h,.hpp或其他),然後透明地更改源文件中的實現。

此外,剛剛提到它,有沒有這樣的事情C/C++:有C且有C++;那些是不同的語言(這確實分享很多,但仍然)。

+2

關於頭文件中額外信息的好處 - 可能想提及成員函數的默認參數,只能在頭文件中指定,而大多數模板代碼只能存在頭文件中。 – AshleysBrain 2010-05-26 14:15:15

+0

@AshleysBrain:的確很好的例子。將它們添加到我的答案中。謝謝 ! – ereOn 2010-05-26 14:33:07

0

考慮到你已經聲明瞭一些函數並編寫了它們的實現,你將有一個.c/cpp文件和一個頭文件.h文件。

你必須要使用這些功能做什麼:

  1. 創建庫(DLL/SO或靜態庫.A/.LIB - 現在我推薦使用的方便性的靜態庫)從這些文件是執行駐留程序
  2. 在程序中使用頭文件(#include it)(不需要重寫頭文件)以獲取函數定義並與步驟1中的庫鏈接。

雖然>this <是Visual Studio的一個示例,它對於其他開發環境也非常合適。

+3

其實你不必創建一個庫。你也可以鏈接到目標文件(爲了完整性)。 – 2010-05-26 13:45:20

+0

@ Space_C0wb0y True – INS 2010-05-26 14:53:11

0

這似乎是一個基本的問題,所以假設我沒有誤讀, 這裏是再利用的一個基本的例子,來回答你的第一個問題:

#include "stdio.h" 

int main(int c, char ** argv){ 
    puts("Hello world"); 
} 

說明: 1.標準輸入輸出.h是一個C頭文件,其中包含一個名爲puts()的函數的定義。 2.在main中,puts()被調用,從包含的定義中被調用。

一些編譯器(包括gcc我認爲)有一個選項來生成標題。

0

總是有關於C++中的標題和源文件的verymuchconfusion。我提供的鏈接應該有助於澄清這一點。

如果您處於想要從源文件中提取標題的情況,那麼您可能會以錯誤的方式進行操作。通常你首先在頭文件中聲明你的函數,然後在源文件中爲它提供一個實現(定義)。如果你的函數實際上是一個類的方法,你也可以在頭文件中提供定義。

從技術上講,一個頭文件僅僅是一個,實際上是由預處理器插入到源文件中的文本的一堆:

#include <vector> 

告訴預處理器在準確的位置插入的文件向量的內容,其中出現#include。這真的只是文字替換。所以,頭文件不是某種特殊的語言結構。它們包含正常的代碼。但通過將該代碼放入單獨的文件中,您可以使用預處理器輕鬆地將其包含在其他文件中。

+0

+1可能是最好的答案 – nico 2010-05-27 00:13:32

+0

-1這是對頭文件/源文件如何工作的解釋,而不是對問題的回答。 – 2010-05-27 07:06:52

+0

在我看來,這個問題的提出方式表明OP不理解標題的工作方式。如果他這樣做了,他自己就可以回答他的問題。任何解決他的問題的答案,但並不能幫助他首先理解它,但實際上並沒有什麼幫助。我想我已經提供了讓他自己解決問題所需的所有信息。 – 2010-05-27 07:10:57

1

在我看來,你並不真的需要/想從源自動生成標題;您希望能夠編寫單個文件並擁有一個可以智能地將其分割爲頭文件和源文件的工具。

不幸的是,我不知道有任何這樣的工具。當然可以編寫一個 - 但你需要一個給定的C++前端。你可以嘗試使用clang寫一些東西 - 但這將是一項重要的工作。

0

你可能感興趣Lazy C++。但是,在嘗試使用此工具之前,您應該採用老式方式(使用單獨的標題和源文件)來完成一些項目。我考慮過自己使用它,但後來認爲我會不小心編輯生成的文件而不是lzz文件。