簡體   English   中英

如果我在實現(.cpp)文件中定義一個函數而不在頭文件中定義它會發生什么?

[英]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.

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