2014-02-26 48 views
0

是否可以調用a.cpp中定義的函數以在b.cpp中使用,而無需在任何頭文件中聲明a.cpp中的函數。在其他源文件中沒有公共頭文件訪問功能

+1

是的,你可以在b.cpp中放置函數的原型。但爲什麼? –

+1

對不起,我的意思是你可以在使用前在'b.cpp'中聲明*函數。顯而易見的問題是「你想要解決什麼問題?」 – juanchopanza

+0

感謝所有與原型定義我可以做到這一點,@JeremyWest它被建議我重用,而不是裝箱分離靜態,只是好奇是有可能沒有原型。 – Meluha

回答

2

是的,雖然不值得推薦。

實際上,頭文件包含的內容實際上是將頭文件的內容放入源代碼的預處理程序發現#include指令的確切位置。因此,而不是使用include指令,代碼可以手動在該位置寫的,程序是相同的:

頁眉:

//a.h 

void foo(); 

//a.cpp 
#include "a.h" 

void foo() { 
    //do something 
} 

//b.cpp 
#include "a.h" 
void bar() { 
    foo(); 
} 

預處理是一樣的後

//a.cpp 
void foo(); 

void foo() { 
    //do something 
} 

//b.cpp 
void foo(); 

void bar() { 
    foo(); 
} 

因此,您可以省略標題並在需要調用它的任何地方手動聲明函數。然而,標題確保了整個項目中的聲明是相同的。例如。如果你改變foo採取參數:

//a.h 
void foo(int); 

現在b.cpp編譯器會告訴你,呼叫foo()不匹配的聲明。如果你離開了頭和手動聲明它,而不是,如果你忘記改變b.cpp聲明,編譯器將假設存在的foo兩個版本,因爲你告訴他這樣:

//a.cpp 
void foo(int); //version 1 
void foo(int i) { 
    //do something 
} 

//b.cpp 
void foo(); //oops. forgot to change that. compiler assumes a second version 

void bar() { 
    foo(); //ok, try to call version 2... 
} 

這將編譯,然而,鏈接器會告訴你一些關於void foo()的未定義參考的信息,在b.obj中調用。

+0

仍然由於某些原因,我必須使用第二種方法,我是否嚴格需要在b.cpp中定義原型或者在b.cpp中沒有原型是否可能? – Meluha

+0

@SagarKotecha「原型」不是*定義*。這是一個*聲明*。 *定義*是你在'a.hpp'中找到的東西,也就是它的主體函數。我沒有挑剔的意思,但如果你使用正確的術語,人們會更好地理解你在說什麼。是的,你必須先聲明一個函數,然後才能使用它。然而,如果你告訴我們爲什麼你認爲你必須這樣做,即告訴我們你想要達到什麼*(而不是如何),我們可能會告訴你如何更好地使用標題。 –

+0

對不起,我的意思是「定義原型」的聲明(這是錯誤的)。 – Meluha