我有这个功能:
void hex_display(void const *v_ptr, int num)
{
uchar const *ptr = v_ptr;
int i;
for (i=0; i<num; i++)
{
if(i != 0)
{
if(((i%4) == 0) && ((i%16) != 0))
{
fprintf(fp, "\t");
}
if((i%16) == 0)
fprintf(fp, "\n");
fprintf(fp, "%02x", ptr[i]);
}
else
fprintf(fp, "%02x", ptr[i]);
}
fprintf(fp, "\n");
}
我将其转换为如下宏:
#define hex_display(v_ptr, num)\
{\
uchar const *ptr = v_ptr;\
int i;\
for (i=0; i<num; i++)\
{\
if(i != 0)\
{\
if(((i%4) == 0) && ((i%16) != 0))\
{\
fprintf(fp, "\t");\
}\
if((i%16) == 0)\
fprintf(fp, "\n");\
fprintf(fp, "%02x", ptr[i]);\
}\
else\
fprintf(fp, "%02x", ptr[i]);\
}\
fprintf(fp, "\n");\
}
我有另一个Macro print_struct:
#define print_struct(str) hex_display((str), sizeof(*(str)))
即,无论何时我调用print_struct,它都会在内部调用hex_display。每一次,它都给了我这个警告:
警告:从不兼容的指针类型初始化[启用 默认]
我做错了什么?如何删除此警告?
答案 0 :(得分:1)
问题在于(相当可怕的,imo)宏中的这一行:
uchar const *ptr = v_ptr;
这会将v_ptr
视为指向uchar
的指针,但如果它不是,那么就会发生编译器警告的转换。
添加演员:
uchar const *ptr = (uchar *) v_ptr;\
答案 1 :(得分:1)
你的函数有void *参数,因此类型检查不起作用。在宏中没有void *,当你使用带有char *参数的宏时,它的第一行将char *分配给uchar *,这会导致警告。将uchar *更改为char *或添加演员。