将函数转换为宏后的宏调用问题

时间:2014-01-29 09:43:08

标签: c pointers recursion macros

我有这个功能:

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。每一次,它都给了我这个警告:

  

警告:从不兼容的指针类型初始化[启用   默认]

我做错了什么?如何删除此警告?

2 个答案:

答案 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 *或添加演员。