2016-07-29 72 views
2

我最近在閱讀關於使用const關鍵字作爲函數參數在C中的使用方法以及在When and for what purposes should the const keyword be used in C for variables中提到的使用方法,並且被接受爲正確答案。在這篇文章中,有一點提到爲什麼在通過值傳遞的參數的頭文件的函數聲明中const是不必要的?

從來沒有在一個函數原型使用const由 值傳遞的參數。它沒有意義,因此只是'噪音'。

我用這樣的方式,它爲我工作,但我不知道爲什麼這是一個噪音爲按值傳遞的參數,但不是通過引用(更貼切的指針值傳遞的參數噪聲C,因爲在C中沒有pass by valuepass by reference的概念)。所以,當我通過一個指針作爲函數參數並使用const關鍵字時,我必須爲頭文件中的聲明和C文件中的定義執行此操作,但我不需要在聲明(頭文件)中使用const關鍵字作爲非指針參數,只能在定義函數時使用它C文件。

任何解釋?

+1

由於您正在傳遞值,因此更改該值沒有實際影響。將它稱爲const並不是很有用。 –

+1

使用「double sqrt(double)」還是「double sqrt(const double)」對調用代碼沒有絲毫影響。如果用戶有:'double x = 3.14; double y = sqrt(x);''sqrt()'函數不能修改變量'x'而不管'const'是否存在(並且返回類型中的'const'也是毫無意義的) 。儘管如此,指針確實很重要。如果你有'char * fgets(const char * buffer,size_t buflen,FILE * fp);',它承諾不修改緩衝區指向的數據,這使得它無法作爲輸入函數 - 它必須修改緩衝區。 –

回答

5

您引用的語句有點令人誤解,因爲在C中,所有參數都是按值傳遞的。 *我想它是試圖區分這些論證本身,對於指針參數的特殊情況,它們是指稱對象。

無論如何,問題的關鍵是const - 在函數聲明中限定函數參數不會傳遞任何信息給調用者。無論如何限制,該函數無論如何都不能修改任何參數的調用者副本,因爲參數已通過值傳遞。

*但是,請注意,數組永遠不會傳遞。在函數調用表達式中,就像在大多數上下文中一樣,數組值指向「衰減」指針,而這些指針是按值傳遞的。這產生了一個類似但不完全相同的效果,如果數組通過引用傳遞的話會有什麼效果。

2

這是規則。如果在聲明的函數中,你不標記你的參數const,你可以可以標記它們const定義

一些人喜歡在定義中標記儘可能多的參數const,因爲它可以防止功能參數的無意修改;這可能會引入錯誤。就我個人而言,我不這樣做,但大量房屋(包括總部位於蘇格蘭的大型銀行)堅持這種風格。

+0

關於使用'void foo(const int x){...}的動機LSNED' – chux

相關問題