它可以或可以被認爲是不好的做法返回const
數據成員指針從const struct
?如下所示返回非const
指針有什麼危險?在C中返回const const成員爲非const:好還是壞?
widget_t * widget_child(const widget_t * parent)
{
if (!parent)
return NULL;
return parent->child;
}
它可以或可以被認爲是不好的做法返回const
數據成員指針從const struct
?如下所示返回非const
指針有什麼危險?在C中返回const const成員爲非const:好還是壞?
widget_t * widget_child(const widget_t * parent)
{
if (!parent)
return NULL;
return parent->child;
}
是否可以接受來自const
限定的struct
的特定非const
數據成員完全取決於它所屬的數據結構的語義。
這不是法律上的錯誤,C對這個問題不能再多說了。
作爲程序員,您(希望)知道並理解語義的人是可信賴的(出於成功/效率)選擇正確。
即使爲const
-qualified,C刻意讓你忽略它如果你確信你是正確的,並承擔後果。此重寫採用顯式強制轉換的形式。
的const
關鍵字並沒有真正定義任何常數C.它所要表達的主要是編譯器一個承諾:const
標識符將只讀這一特定範圍內進行治療。 const
應被理解爲readonly
,這是從C
年初壞命名這將允許編譯器執行某些優化,如果懷疑被叫方被調用函數中修改這個標識符就不能這樣做。
基準是:這是完全合法的,因爲承諾保持不變。
這取決於您未描述的'widget_t'的語義。可以修改'const widget_t'的子元素,還是'const widget_t'是指一個不能修改它或其子元素的小部件? –
更多問題是標準庫中的char * strchr(const char * str,char c)'。在這裏,你必須返回一個非常量指針到常量字符串中的一個位置。 C++不喜歡這樣;它打破了常量正確性的概念。 –
@JonathanLeffler:這就是C++用兩個具有相同語義的函數替代這個函數的原因,除了保持const正確性。 – Deduplicator