2016-04-15 36 views
1

通常聲明一個函數(例如在一個頭文件中),然後再定義它(例如在一個源文件中)。當我不得不對一個函數應用一個修飾符(例如static,inline,const,extern,default arguments等等)時,我永遠不會記得它是應該放在聲明中,還是放在定義中,或者兩者兼而有之。頭文件或源文件中的C++函數修飾符?快速參考

例如,從我所知道的,參數可以是在一方或雙方const的聲明和定義,功能,必須在聲明和定義const,功能必須是唯一的static在聲明等等。

您能否提供所有可能的功能修飾符的快速參考列表,以及它們是否應在聲明,定義或兩者中分配?許多個人案例似乎都曾在此網站上提出過,因此將這些答案集中在一起會很好。 或者,有沒有什麼經驗法則可以找出應用修飾符的地方?

+0

如果我沒有記錯的話,任何和*是函數簽名*的一部分的東西都會出現在這兩個文件中。 – CinCout

+1

就const而言,它必須位於聲明和定義中,否則被認爲是不同的超載。這同樣不適用於內聯修飾符。你可以在同一個頭文件中有一個聲明和定義,只有定義必須有內聯關鍵字。 – rozina

+0

@ tobi303恐怕你錯了。參數'const'免除函數簽名,並且它們不應該在聲明時爲const。原因在於,如果您稍後決定在定義中更改其「const」限定條件(例如,將其用作循環計數器),則不必更新標頭,因此您的客戶(包括您自己)不需要不必重新編譯所有包含'#include'的文件。參考_does_問題的'const',但這與參數(即局部變量)本身無關。 –

回答

0

當您在頭文件中聲明並在源文件中定義時,可能的經驗法則是 - >如果希望修改器影響使用該函數的每個源,然後將其放入頭中。大多數情況下你想影響所有的源文件。

但是,確實沒有一般的規則。你必須瞭解每個修飾符的作用,然後確切地知道它爲什麼寫在一個頭文件或源文件中或兩者中。

+0

不,對於可以/必須聲明的功能的不同方面有特定的規則,以及影響是什麼。這很少只是你在這裏暗示的個人選擇。 –