【问题标题】:Macro calling issues after converting a function to a Macro将函数转换为宏后的宏调用问题
【发布时间】:2014-01-29 09:43:07
【问题描述】:

我有这个功能:

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");\
}

我还有另一个宏 print_struct:

#define print_struct(str)  hex_display((str), sizeof(*(str)))   

即,每当我调用 print_struct 时,它都会在内部调用 hex_display。每次,它都会给我这个警告:

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

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

【问题讨论】:

  • 这没有任何意义。函数的宏形式实际上命名为print_mem(),但你打错了吗?
  • 答案解释了您在定义宏时出错的地方,但恕我直言,您的主要错误是从一开始就将其设为宏 :-) 为什么您希望它成为宏?
  • 仍然从您的最后一个问题(编号 21326738)将您的函数转换为宏对我来说没有任何意义。只是不要这样做。它什么也没给你带来,也没有任何性能提升,只会混淆你的代码。真的,不要。
  • uchar const *ptr = (void *)v_ptr;\

标签: c pointers recursion macros


【解决方案1】:

问题是(相当可怕,imo)宏中的这一行:

uchar const *ptr = v_ptr;

这会将v_ptr 视为指向uchar 的指针,但如果不是,则会发生编译器警告的转换。

添加演员表:

uchar const *ptr = (uchar *) v_ptr;\

【讨论】:

    【解决方案2】:

    您的函数有 void* 参数,因此类型检查在其中不起作用。在宏中不再有 void*,当您使用带有 char* 参数的宏时,它的第一行将 char* 分配给 uchar*,这会导致警告。将 uchar* 更改为 char* 或添加演员表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多