初始化丢弃来自指针目标类型的限定符

Posted

技术标签:

【中文标题】初始化丢弃来自指针目标类型的限定符【英文标题】:Initialization discards qualifiers from pointer target type 【发布时间】:2011-01-19 22:59:42 【问题描述】:

我正在尝试打印我在link text 中提到的单链表的列表。它可以工作,但我确实收到了编译器警告:

Initialization discards qualifiers from pointer target type

(关于 start = head 的声明)和

return discards qualifiers from pointer target type

(在返回语句中)在此代码中:

/* Prints singly linked list and returns head pointer */
LIST *PrintList(const LIST *head) 

    LIST *start = head;

    for (; start != NULL; start = start->next)
        printf("%15s %d ea\n", head->str, head->count);

    return head;

我正在使用 XCode。有什么想法吗?

【问题讨论】:

仅供参考,我已经让 gcc 打印了类似这样的不明警告,我认为这些警告是由 -Wwrite-strings 控制的。还有-Wdiscarded-qualifiers-Wcast-qual 和clang 的-Wincompatible-pointer-types-discards-qualifiers,看起来也很相关。 【参考方案1】:

就是这个部分:

LIST *start = head;

函数的参数是一个指向常量const LIST *head的指针;这意味着您无法更改它所指向的内容。但是,上面的指针指向非常量;您可以取消引用并更改它。

它也必须是const

const LIST *start = head;

这同样适用于您的返回类型。


所有编译器都在说:“嘿,你对调用者说'我不会改变任何东西',但你正在为此开辟机会。”

【讨论】:

愚蠢的问题,但是 const 返回类型是什么样的?我尝试在网上搜索,但似乎找不到。 @Crystal - const LIST *PrintList(const LIST *head) ... The parameter for the function is a constant pointer - 不正确。 const LIST *head 将 head 声明为指向常量 LIST 的指针。见:c-faq.com/decl/constparm.html——也许这只是措辞上的误解。 喜欢用自然语言解释它,就好像编译器会说话一样。很好的解释!【参考方案2】:

在下面的函数中,会得到你遇到的警告。

void test(const char *str) 
  char *s = str;

有3个选择:

    去掉param的const修饰符:

    void test(char *str) 
      char *s = str;
    
    

    将目标变量也声明为 const:

    void test(const char *str) 
      const char *s = str;
    
    

    使用类型转换:

    void test(const char *str) 
      char *s = (char *)str;
    
    

【讨论】:

以上是关于初始化丢弃来自指针目标类型的限定符的主要内容,如果未能解决你的问题,请参考以下文章

传递'memcpy'的参数2从指针目标类型中丢弃'volatile'限定符

2.4 const限定符

QT & C++:传递 'const QString' 丢弃限定符

2.6 const限定符与引用指针

我的指针导致“多次使用相同类型的限定符”警告?

将 'const QVariant' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]