我有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 *’
这是使用gcc 4.6.0。对于4.5.0及更早版本,一个简单的转换为(char *)足以抑制此警告,但gcc似乎已经变得“更聪明”了。我已经尝试了(char *)(void *)k
,但它仍然知道变量最初是const
。如果不在strdup(3)
上调用k
来阻止此警告,最好的方法是什么?
答案 0 :(得分:2)
我刚用gcc 4.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
,则警告会被取消。您能否确认我的代码示例仍然出现错误?