2012-02-23 159 views
4

我最近對代碼進行了一些調整,其中我必須更改函數中的形式參數。原來,該參數是類似以下內容(注意,結構早前typedef定義):聲明const的指針或const指針作爲形式參數

static MySpecialStructure my_special_structure; 
static unsigned char char_being_passed;    // Passed to function elsewhere. 
static MySpecialStructure * p_my_special_structure; // Passed to function elsewhere. 

int myFunction (MySpecialStructure * p_structure, unsigned char useful_char) 
{ 
    ... 
} 

做出更改,因爲我可以定義並初始化my_special_structure之前編譯時和myFunction的從未改變它的價值。這導致了以下變化:

static const MySpecialStructure my_special_structure; 
static unsigned char char_being_passed;    // Passed to function elsewhere. 
static MySpecialStructure * p_my_special_structure; // Passed to function elsewhere. 

int myFunction (const MySpecialStructure * p_structure, unsigned char useful_char) 
{ 
    ... 
} 

我還注意到,當我跑絨我的程序,有幾個信息818的引用許多不同的功能。信息指出「指針參數'x'(第253行)可以被聲明爲指向const」「。

現在,我有兩個問題關於上述。首先,關於上面的代碼,由於MySpecialStructure中的指針和變量都沒有在函數內改變,所以將指針聲明爲常量是否有益呢?例如 -

int myFunction (const MySpecialStructure * const p_structure, unsigned char useful_char) 

我的第二個問題是關於Lint信息。如果函數不改變它的值,那麼將指針指定爲常量形式參數是否有任何優點或缺點...即使傳遞給函數的內容從未被聲明爲常量?例如 -

static unsigned char my_char; 
static unsigned char * p_my_char; 
p_my_char = &my_char; 

int myFunction (const unsigned char * p_char) 
{ 
    ... 
} 

感謝您的幫助!

編輯澄清 -

什麼是聲明指針constconst指針const的優勢 - 作爲一個正式的參數?我知道我可以做到這一點,但我爲什麼要...特別是在傳遞指針和它指向的數據沒有聲明爲常量的情況下?

回答

7

將指針聲明爲const的優點 - 作爲形式參數?我知道我可以做到這一點,但我爲什麼要...特別是在指針被傳遞並且它指向的數據沒有被聲明爲常量的情況下?

我以爲你的意思是指向const的指針。

通過指向const作爲參數,其優點是通過告訴程序員您的函數不修改指針指向的對象來記錄API。

例如看memcpy原型:

void *memcpy(void * restrict s1, const void * restrict s2, size_t n); 

它告訴指向的對象s2不會通過memcpy調用修改的程序員。

它還提供了編譯器強制執行的文檔,因爲如果您從指向const的指針修改指針,則實現將發出診斷。

+0

我的意思是一個指向'const'的指針,謝謝......當我試圖澄清只是爲了增加更多混淆時,我討厭它。 – 2012-02-23 19:09:47

2

對於第一個問題,如果你確定沒有修改它指向的指針或變量,你可以通過一切手段繼續前進,並使它們保持不變!

現在,你的Qn爲什麼要聲明一個正式的指針參數爲const,即使傳入的指針不是常量,典型的用例是庫函數printf()printf應該接受const char *,但即使您將char*傳遞給它,編譯器也不會抱怨。在這種情況下,有意義的是printf()不會因用戶的錯誤而建立,並且不經意地改變用戶的數據!它就像printf()清楚地告訴你 - 無論你通過const char *char*,別擔心,我仍然不會修改你的數據!

對於第二個問題,const指針在嵌入式世界中找到出色的應用程序,我們通常直接寫入內存地址。Here是詳細解釋

+0

我想我應該更好地說我的問題......將指針聲明爲const **作爲正式參數**有什麼優勢?我知道我可以做到這一點,但爲什麼我要......特別是在傳遞指針並指向它的數據沒有被聲明爲常量的情況下? – 2012-02-23 18:54:30

+0

我更新了我的答案! – 2012-02-23 19:17:46

3

如果您聲明一個形式參數爲const,編譯器可以檢查您的代碼是否嘗試修改該參數,從而產生更好的軟件質量。

3

const還允許您指示功能的用戶,您將不會修改背在身後

1

那麼這個參數,有什麼東西聲明爲const的優勢,同時你有沒有這樣做的選擇?畢竟,如果你沒有觸及它,無論它是否爲const都沒關係。這提供了一些編譯器可以爲您執行的安全檢查,並提供了函數接口的一些信息。例如,可以安全地將字符串文字傳遞給期望const char *的函數,但是如果參數聲明爲char *,則需要小心。

2

Const的正確性是一件美妙的事情。首先,它讓編譯器幫助你避免犯錯誤。當你打算比較時,一個明顯的簡單情況是分配。在這種情況下,如果指針是const,編譯器會給你一個錯誤。 Google 'const correctness',你會發現很多關於它的好處的資源。

相關問題