2014-01-29 3 views
-1

Я имел эту функцию:Macro вопросов, требующих после преобразования функции к Macro

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. И каждый раз, это дает мне это предупреждение:

предупреждение: инициализации из несовместимого типа указателя [включено по умолчанию]

Что я делаю не так? Как удалить это предупреждение?

+1

Это не имеет никакого смысла. Является ли макрокоманда функции фактически названной 'print_mem()', но вы неправильно набрали? – unwind

+0

Отредактировано. Была опечатка. – aod

+0

Ответы объясняют, где вы ошибались в определении макроса, но ИМХО ваша главная ошибка заключалась в том, чтобы сделать макрос для начала :-) Почему вы хотите, чтобы это был макрос? – delnan

ответ

1

Проблема эта линия в (довольно ужасный, IMO) макрос:

uchar const *ptr = v_ptr; 

Это относится v_ptr как указатель на uchar, но если это не так, то есть преобразование происходящий который компилятор предупреждает.

Добавить слепок:

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

Ваша функция была пустота * аргумент, поэтому типы проверки не работал в нем. В макросе больше нет void *, и когда вы используете макрос с аргументом char *, его первая строка присваивает char * uchar *, что вызывает предупреждение. Измените uchar * на char * или добавьте бросок.

Смежные вопросы