[英]if I define a function in the implementation (.cpp) file without defining it in the header file what happens?
我是C ++菜鳥。 我有一個定義函數的foo.cpp文件,
void sort() {
// details of sort algorithm
}
我沒有在相應的頭文件中定義它,但我沒有得到編譯錯誤。 我注意到這被視為一種靜態方法。 是這樣的嗎? 我到底在這做了什么?
編輯:
我注意到在這個方法中我不能使用它,(例如:this-> bar),因此我假設這是一個靜態函數。 這實際上發生在我想要一個'私有'方法時,但忘了在頭文件中聲明它。 是否真的使用過這樣的功能?
該功能與該翻譯單元中提供的其他功能類似。 但你仍然可以從任何地方訪問它,因為它只有外部鏈接。 所以這樣做:
void foo()
{
extern void sort();
sort();
}
它在該編譯單元之外是不可見的,它不受單個編譯單元的約束,它只是一個需要聲明才能被調用的定義。 像任何其他定義一樣。
wtf.cpp:
#include <iostream>
void f(){ std::cout<< "f();"; }
omg.cpp:
void f(); // I can declare wherever I use it.
int main(){ f(); }
$ g++ wtf.cpp omg.cpp && ./a.out
輸出: f();
不,它不被視為靜態功能。 它只是其他轉換unnits不可見,所以你不能使用它。
關於靜態方法的不同之處在於鏈接器看到函數。 因此,如果在另一個轉換單元中定義具有相同名稱的函數,則可能會出現鏈接器錯誤(最佳情況)或有時調用錯誤的方法。
PS:我在這里討論函數而不是方法 ,因為在C ++中,方法通常是類的一部分,如果該方法未在該類的聲明中聲明,則無法為類定義方法。
什么都沒發生。 該函數將在那里並且基本上可用,但是沒有原型/前向聲明,其他翻譯單元/代碼的部分將不知道它實際上存在(並且基於優化級別,它可能被排除在生成的可執行代碼之外)。
您已經創建了一個只對該編譯單元(以及包含源本身的其他單元)可見的函數。
你剛剛定義了一個自由函數。
您可以在實現文件中使用,因為聲明在調用之上 (解析器從上到下“讀取”源文件):
void fun(){
mysort(); // Compile Error
void mysort(){}
void anotherFun(){
mysort(); // Works here
}
要擺脫這種邊界效應,可以在文件的開頭添加函數的原型。 我經常將這個“自由函數”用於小型轉換宏。
示例:
char* BigEndianToLitteEndian( char word[], int size); // prototype
void routine()
{
....
le = BigEndianToLittleEndian( be, SIZE );
....
}
char* BigEndianToLitteEndian( char word[], int size){ // implementation
....
}
即使它只在實現文件中,除非你指定static
否則它不是static
。
除了限制訪問之外,靜態函數還可以允許編譯器優化以獲得更好的性能。
請參閱C中的靜態函數 ,特別是@ Stephen_Canon的答案 。
如果在具有相同簽名的其他cpp文件中定義相同的函數,也可能非常糟糕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.