2010-02-23 56 views
31

我試圖列出我在link text中提到的單獨鏈接列表。它的工作原理,但我得到的編譯器警告:初始化丟棄指針目標類型的限定符

Initialization discards qualifiers from pointer target type

(啓動=頭部的聲明)和

return discards qualifiers from pointer target type

(上return語句)在此代碼中:

/* 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。有什麼想法嗎?

回答

65

這是這一部分:

LIST *start = head; 

該函數的參數是一個指向一個常數,const LIST *head;這意味着你不能改變它指向的內容。但是,上面的指針是非const的;你可以解引用它並改變它。

它需要const還有:

const LIST *start = head; 

這同樣適用於你的返回類型。


所有的編譯器說的是:「嘿,你給調用者‘我不會改變任何事情’,但是你對於開放機會說。」

+0

愚蠢的問題,但到底是什麼一個const返回類型是什麼樣子?我試圖在網上搜索,我似乎無法找到一個。 – Crystal 2010-02-23 06:00:28

+5

@Crystal - 'const LIST * PrintList(const LIST * head){...}' – 2010-02-23 07:42:05

+0

'該函數的參數是一個常量指針 - 不正確。 'const LIST * head'聲明頭是一個指向常量LIST的指針。請參閱:http://c-faq.com/decl/constparm.html - 也許這只是措辭上的一個誤解。 – CivFan 2015-09-17 17:48:10

17

在下面的函數,你會得到你所遇到的警告,

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

有3種選擇:

  1. 刪除參數的時const修飾:

    void test(char *str) { 
        char *s = str; 
    } 
    
  2. 將目標變量聲明爲const:

    void test(const char *str) { 
        const char *s = str; 
    } 
    
  3. 使用類型轉換:

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