Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to correctly address -Wcast-qual

Tags:

c

gcc

gcc-warning

I have a variable k of type const char *, and a function in glib with the prototype

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

gpointer is defined simply as

typedef void* gpointer;

I know that in this case it is, in fact, okay to pass in k as the key in g_hash_table_replace, however gcc gives me the error

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

this is with gcc 4.6.0. With 4.5.0 and earlier, a simple cast to (char *) sufficed to supress this warning, but gcc seems to have gotten 'smarter'. I've tried (char *)(void *)k, but it still knows that the variable was originally const. What is the best way to silence this warning without calling strdup(3) on k?

like image 995
Bobby Powers Avatar asked Nov 04 '22 18:11

Bobby Powers


1 Answers

I just tried this with 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;
}

Without casts, the error is as you describe above. But if I cast the const char* to intptr_t first as shown above, the warning is suppressed. Can you confirm that you still experience the error with my code sample?

like image 104
Seth Avatar answered Nov 09 '22 10:11

Seth