【问题标题】:C: Compiler warning "return discards qualifiers from pointer target type"C:编译器警告“从指针目标类型返回丢弃限定符”
【发布时间】:2014-09-09 21:45:16
【问题描述】:

我从下面的函数中得到一个编译器“警告:从指针目标类型返回丢弃限定符”。

unsigned char* getBeginning(const unsigned char * Packet)
{
                    return Packet+3;
}

我在 SO 和其他地方对此进行了研究,似乎编译器抱怨说,虽然我接受了一个 const 指针,但我返回了一个非常量指针。

我想要完成的是:

1) 我想让用户知道我不会在这个函数中更改他们的任何数据,因此是 const。

2) 但是,后面的函数会使用此处返回的指针进行更改,所以我不想将返回类型也设为 const。

在我没有收到警告的情况下,有没有更好的方法来做到这一点?我还在学习 C。

【问题讨论】:

  • 您确定要删除const吗?这听起来是个坏主意……
  • @sircodesalot:对于这种情况,这是一个常见的 C 习惯用法(替代方法是编写两个函数(一个用于const,一个用于非const),或者只编写一个非-const 版本并让调用者将const 扔掉),参见。 strchr.
  • 感谢您的回答!阅读回复后,我可能完全错了。我打算让用户给我一个 unsigned char *。它不必是 const unsigned char *。我想我可以在函数定义中使用“const”来表明我不会修改指向这个特定函数的数据。所以,换句话说,我不希望用户给我一个 const unsigned char *,我只是想告诉他们我不会在这里碰 unsigned char *。稍后,返回的指针确实会修改数据。有没有更好的方法来做到这一点?

标签: c pointers constants


【解决方案1】:

Packet 被声明为const unsigned char *。添加 3 时如果没有显式转换,则隐式声明结果为相同类型。

要修复错误,您必须显式转换返回类型:

return (unsigned char *) Packet + 3;

【讨论】:

    【解决方案2】:

    C 没有从 const 限定指针类型到非 const 限定指针类型的隐式转换,因此您应该添加一个显式转换,即强制转换。然后警告就会消失:

    unsigned char* getBeginning(const unsigned char * Packet)
    {
                        return (unsigned char *)Packet+3;
    }
    

    请注意,这个函数有点“危险”,因为它可以隐藏 const 限定的删除。但它并不比标准库中的strchr 之类的东西更危险。只要您避免尝试通过返回的指针修改 const 限定的对象,该行为就完全定义好了。

    【讨论】:

    • 如果我理解你,修改strchr 的返回会导致未定义的行为,对吧?
    • 不是真的,它取决于传递给它的指针,如果 itconst char,那么修改它会有风险.. . 只是不要期望将字符串常量传递给它会返回一个指向可修改 char 数组的新指针(不会发生 malloc + memcpy),但是如果您将常规 char* 传递给它,这些内存位置将保持不变,如果它指向char[99],那么修改这 99 个字节是安全的
    • 重要的不是传递给它的指针的类型,而是指向的对象的类型。如果是const char 数组或字符串字面量,则通过strchr 的返回值进行修改会产生UB。如果它是一个不是字符串文字的char 数组,则修改是有效的(没有任何其他未定义的原因,如数据竞争等)
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多