2014-04-06 82 views
4

它可以或可以被認爲是不好的做法返回const數據成員指針從const struct?如下所示返回非const指針有什麼危險?在C中返回const const成員爲非const:好還是壞?

widget_t * widget_child(const widget_t * parent) 
{ 
if (!parent) 
    return NULL; 

return parent->child; 
} 
+0

這取決於您未描述的'widget_t'的語義。可以修改'const widget_t'的子元素,還是'const widget_t'是指一個不能修改它或其子元素的小部件? –

+0

更多問題是標準庫中的char * strchr(const char * str,char c)'。在這裏,你必須返回一個非常量指針到常量字符串中的一個位置。 C++不喜歡這樣;它打破了常量正確性的概念。 –

+0

@JonathanLeffler:這就是C++用兩個具有相同語義的函數替代這個函數的原因,除了保持const正確性。 – Deduplicator

回答

1

是否可以接受來自const限定的struct的特定非const數據成員完全取決於它所屬的數據結構的語義。
這不是法律上的錯誤,C對這個問題不能再多說了。
作爲程序員,您(希望)知道並理解語義的人是可信賴的(出於成功/效率)選擇正確。

即使const -qualified,C刻意讓你忽略它如果你確信你是正確的,並承擔後果。此重寫採用顯式強制轉換的形式。

0

這很好。指針本身就是值(畢竟它是一個地址)。您從const結構讀取該值。沒關係。您返回該值。這也很好。

+1

如果你像這樣隨心所欲地拋棄'const'',那麼使用'const'有什麼意義呢? – Emmet

+3

但是請注意,代碼不會返回任何允許調用者修改struct'* parent'的東西。因此,這段代碼尊重'* parent'的常量。沒有關於'*(父 - >子)'的'const'。 – guest

+0

一個const結構體可以位於只讀存儲器中,並且子指針也指向一個只讀存儲器。扔掉const似乎是危險的。對? –

0

const關鍵字並沒有真正定義任何常數C.它所要表達的主要是編譯器一個承諾:const標識符將只讀這一特定範圍內進行治療。 const應被理解爲readonly,這是從C

年初壞命名這將允許編譯器執行某些優化,如果懷疑被叫方被調用函數中修改這個標識符就不能這樣做。

基準是:這是完全合法的,因爲承諾保持不變。

相關問題