5

kタイプの変数const char *と、プロトタイプを使用したglibの関数があります

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

gpointer単に次のように定義されます

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 *’

これはgcc4.6.0の場合です。4.5.0以前では、この警告を抑制するには(char *)への単純なキャストで十分でしたが、gccは「よりスマート」になっているようです。試しまし(char *)(void *)kたが、変数が元々であったことはまだわかっていますconststrdup(3)呼び出さずにこの警告を黙らせるための最良の方法は何kですか?

4

1 に答える 1

2

これをgcc4.6.1で試しました。

#include <glib/ghash.h>
#include <stdio.h>
#include <unistd.h>

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私のコードサンプルでまだエラーが発生していることを確認できますか?

于 2011-07-20T15:01:02.453 に答える