一千萬個為什麽

搜索

如何正確地解決-Wcast-qual

我有一個類型為 const char * 的變量 k ,以及一個帶有原型的glib函數

void g_hash_table_replace(GHashTable *hash_table,
                          gpointer key,
                          gpointer value);

gpointer is defined simply as

typedef void* gpointer;

我知道在這種情況下,實際上可以將 k 作為 g_hash_table_replace 中的鍵傳遞,但是gcc給了我錯誤

service.c:49:3: warning: passing argument 2 of ‘g_hash_table_replace’ discards ‘const’ qualifier from pointer target type [enabled by default]
/usr/include/glib-2.0/glib/ghash.h:70:13: note: expected ‘gpointer’ but argument is of type ‘const char *’

這是用gcc 4.6.0。對於4.5.0及更早版本,一個簡單的轉換為(char *)足以抑制此警告,但gcc似乎已經變得“更聰明”了。我已經嘗試了(char *)(void *)k ,但它仍然知道該變量最初是 const 。在不調用 k 上的 strdup(3)的情況下,使這個警告靜音的最佳方法是什麽?

最佳答案

我剛用gcc 4.6.1嘗試過這個。

#include 
#include 
#include 

const char *k="Testing";

int main(int argc, char **argv)
{

    int val = 1024;

    GHashTable *hash_table=NULL;
    g_hash_table_replace(hash_table,(gpointer) (intptr_t)k, &val);

    return 0;
}

如果沒有強制轉換,則錯誤如上所述。但是如果我首先將 const char * 轉換為 intptr_t ,如上所示,則會禁止警告。您能否確認我的代碼示例仍然出現錯誤?

轉載註明原文: 如何正確地解決-Wcast-qual