2012-07-26 48 views
2

我讀儘管這:const char * const versus const char *?爲什麼不strlen的(..)預計爲const char * const的海峽,而不是爲const char *

string.hstrlen被定義爲:

size_t strlen (const char * str); 

如果我正確地理解這個,strlen需要一個指向const的char的指針。它不應該是:

size_t strlen (const char* const str); 

這將確保strlen不能修改指針指向一個不同的指針?

或者,這樣的話:

由於海峽指針會按值傳遞給strlen的,功能上的任何改變這個指針不會改變源指針,因此它的好..

??

+2

'strlen()'無法修改您傳入的指針,無論如何;它會收到一份副本。這隻有在你傳入指針指針時纔有意義。 – cdhowie 2012-07-26 17:03:15

+0

這些函數具有相同的簽名。另見:http://stackoverflow.com/questions/11645751/why-are-const-qualifiers-in-function-arguments-used-for-overloading-resolution http://stackoverflow.com/questions/4212932/defining- a-function-with-different-signature http://stackoverflow.com/questions/3682049/functions-with-const-arguments-and-overloading等等。 – 2012-07-26 17:31:11

回答

11

如果您真的閱讀過這個討論,您應該明白第二個const對函數的外部行爲沒有影響。對於您,strlen的用戶,它是否與const char *const char *const參數聲明沒有任何區別。正如您正確指出的那樣,strlen可能對指針所做的任何修改僅影響strlen內部指針的內部本地副本。無論參數是否使用第二個const聲明,您傳遞給strlen的參數指針都將保持不變。 (你的參數指針甚至不必須是一個左值。)

第二const只會對函數內部的局部參數變量的內部行爲的效果,防止作者strlen從修改本地變量。他們是否想要以這種方式限制自己,非正式地說,是他們自己的事情。它不以任何方式關注strlen的用戶。

事實上,由於頂層const限定符對功能類型沒有影響,通常能夠聲明函數與const char *參數,然後限定它與const char *const參數。編譯器(鏈接器)仍將這些聲明視爲「匹配」。這意味着如果圖書館作者如此期望,他們實際上可以用const char *const參數定義strlen。他們根本沒有告訴你,因爲這實際上是一個實現細節或strlen,即你不需要知道的東西。

+1

+1,標準是明確的,因爲* top-level * const-volatile限定符(在本例中爲第二個'const')從函數的簽名中刪除。 – 2012-07-26 17:01:26

+0

@AndreyT:謝謝你解釋得那麼好,並且給了我一個實際的用例來說明如何將它與'declare' /'define'結構一起使用! – brainydexter 2012-07-26 17:10:44

2

由於海峽指針會按值傳遞給strlen的,這個指針在函數的任何變化都不會改變源指針,因此它的好..

是。這只是對內飾處理功能的限制。

這將確保strlen不能修改指針指向不同的指針嗎?

這不是必須的,指針是按值傳遞的。

2

size_t strlen(const char * const str);

這將確保strlen不能修改指針指向不同的指針?

你自己解釋了原因:strlen不能修改指針...

它不必要強加給參數,其可用於計算長度而修改指針本身,作爲限制:

size_t len = 0; 
while(*str) 
{ 
    ++len; 
    ++str; //error if `const char *const str` is used! 
} 

strlen()執行在glibc它修改指針本身:通過將其分配給可修改的指針類型。

又見OpenBSD LIB implemtation:

size_t strlen(const char *str) 
{ 
    const char *s; 

    for (s = str; *s; ++s) 
     ; 
    return (s - str); 
} 

這裏s=str會出錯,如果strconst char * const型!

+1

真棒,感謝您的鏈接! – brainydexter 2012-07-26 17:13:57

相關問題