我有以下功能:
item *already_met_the_number(const item *p, long n)
{
while (p) {
if (p->num == n)
return p;
else
p = p->next;
}
return NULL;
}
我不想在函数中改变数据结构。但后来我更改了退回的商品。 我从
gcc
编译器收到以下警告:
warning: return discards ‘const’ qualifier from pointer target type
我应该如何遵循良好的编程实践重写我的函数?
使用强制转换来表明转换是经过深思熟虑的:
return (item *) p;
这样做的必要性是 C 语言的一个缺点,部分原因是
const
是较晚添加到该语言中的。
另一种方法是将参数重命名为不太可能无意中使用的名称,并将其复制为更短的名称以在函数内部使用:
item *already_met_the_number(item *p_without_const, long n)
{
const item *p = p_without_const;
while (p) {
if (p->num == n)
return p_without_const;
else
p = p->next;
}
return NULL;
}
唯一的方法是显式转换:
return (item *)p;
基本上这个功能不一致,警告是正确的。通常,参数是
const
,以防止在传递 const 对象或对 const 对象的引用并且函数采用非 const 参数时发出警告。