避免 GCC 编译器警告“返回从指针目标类型中丢弃‘const’限定符”

问题描述 投票:0回答:2

我有以下功能:

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
我应该如何遵循良好的编程实践重写我的函数?

c pointers linked-list constants return-value
2个回答
2
投票

使用强制转换来表明转换是经过深思熟虑的:

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;
}

0
投票

唯一的方法是显式转换:

            return (item *)p;

基本上这个功能不一致,警告是正确的。通常,参数是

const
,以防止在传递 const 对象或对 const 对象的引用并且函数采用非 const 参数时发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.