2011-09-27 148 views
2

我有一個文件命名爲functions.h ....現在我知道在頭文件中定義函數是不明智的,但這與我所關心的問題相比,並沒有出現問題。 ..包含頭文件

我在一個名爲

void sayhi() 
{ 
    cout<<"hi"; 
} 

現在functions.h我做了,其功能在lines.cpp文件中定義一個lines.h文件中定義的函數...在lines.cpp文件包括我functions.h ...和used sayhi();在線類的構造函數...然後在mymain.cpp(包含int main)我再次包含functions.h和主要我叫sayhi();

但是當我編譯程序時,它顯示mymain.cpp中的一個錯誤,告訴sayhi()已經在lines.obj中定義了...你能指出我做錯了什麼嗎?

+0

關於標頭實現的智慧,看到這個問題http://stackoverflow.com/questions/1001639/coding-c-without-headers-best-practices和特別是我的答案http://stackoverflow.com/問題/ 1001639 /編碼-C-沒有報頭條最佳實踐/ 1001749#1001749。 –

+0

該問題正是爲什麼你不應該_define_(又名。實現)一個頭文件中的函數... –

回答

7

好了,解決的辦法是聲明的功能functions.h然後定義它functions.cpp,自然的方式意圖。

+1

+1爲自然。 –

+0

@david ...沒關係,但我還有一個問題....如果我們在頭文件中聲明一個模板類並在.cpp文件中定義它,然後如果我們在main(包含int main)中包含頭文件,文件,那麼爲什麼連接錯誤會突然出現......並且如果我們在主文件中包含.cpp文件(包含頭文件),錯誤不會出現...... – avinash

+0

@avinash將此作爲一個新問題提出。評論不適合提出全新的問題。 –

3

使你的功能inline避免了這個多重定義問題。

嘗試,

inline void sayhi() 
{ 
    cout<<"hi"; 
} 

This鏈接可能對您有所幫助。

特別地,它引用的ISO C++標準的部分7.1.2:

內聯函數應每翻譯單元,其中 它被使用,而且必須具有完全相同在每個相同的定義來定義案例 (3.2)。

這就是爲什麼one-definition-rule規避。