Удаление предупреждений при компиляции - PullRequest
0 голосов
/ 02 ноября 2011

Это пример кода, который я публикую ниже.Я получаю предупреждение при компиляции этой программы, как показано ниже:

    samp2.c: In function `main':
    samp2.c:37: warning: passing arg 1 of `my_func' from incompatible pointer type

Код показан ниже:

     typedef enum TES_status_e
     {
          TES_stat_unknown,
          TES_stat_ok,
          TES_stat_too_high,
          TES_stat_too_low,
          TES_stat_short_GND,
          TES_stat_connected,
          TES_stat_not_connected

      } TES_status_t;

      typedef enum DIAG_status_e 
      {
          DIAG_stat_unknown,
          DIAG_stat_ok,
          DIAG_stat_too_high = 10,
          DIAG_stat_too_low,
          DIAG_stat_short_GND,
          DIAG_stat_connected,
          DIAG_stat_not_connected

      } DIAG_status_t;

     typedef int (*MyPtr)(TES_status_t);

     int my_func(MyPtr);

     int test(DIAG_status_t);

     main()
     {

           my_func(&test);  

     }


     int my_func(MyPtr Val)
     {
       Val(DIAG_stat_too_high);

     }
     int test(DIAG_status_t c)
     {
        printf("The val of c is %d\n",c);   
     }

Это предупреждение показано ниже

          samp2.c: In function `main':
          samp2.c:37: warning: passing arg 1 of `my_func' from incompatible pointer type

Пожалуйста, дайте мне знать, как удалить это предупреждение.

Ответы [ 5 ]

2 голосов
/ 02 ноября 2011

Вы объявили, что my_func принимает функцию, которая принимает перечисление TES_status_t в качестве аргумента, однако фактическая тестовая функция принимает аргумент DIAG_status_t, поэтому вы получаете предупреждение.

Также функция принимает указатель на функцию, ноимя функции типа test на самом деле является указателем функции, поэтому вам нужно только указать имя функции, а не адрес:

my_func((MyPtr)test);
1 голос
/ 02 ноября 2011

GCC прав.

Вы определяете MyPtr как указатель на функцию, которая принимает аргумент TES_status_t, а затем предоставляете указатель на функцию, которая принимает аргумент DIAG_status_t.

EDIT:

Вы можете подавить предупреждение, явно приведя к MyPtr: my_func((MyPtr)test);

Однако это, как правило, путь к катастрофе, потому что вы по сути вводите неочевидные зависимости между типами и кодом, который их использует.

Правда, перечисления в C представлены типом int, и в этом случае оба перечисления, похоже, соответствуют друг другу. Но что произойдет через две недели, когда вы решите, например, добавить новое состояние в DIAG_status_t? Ваша программа будет ломаться неуловимо, и вам будет трудно отследить проблему, потому что вы проигнорируете то, что небольшая проверка типов делает для вас компилятор.

1 голос
/ 02 ноября 2011

Подождите, предупреждение похоже на то, что оно мне подходит.

Несмотря на то, что вы думаете, TES_status_t не эквивалентен DIAG_status_t.

Я рекомендую исправить ваш код, а не предупреждение.

0 голосов
/ 02 ноября 2011

Редактируйте строку 37 вашего samp2.c файла, пока не получите больше предупреждений. Не выключайте предупреждения компилятора, они очень полезны. Если вы используете gcc, попросите (почти) всех из них набрать -Wall.

Значение TES_status_t не является значением DIAG_status_t (но не думайте, что приведение TES_stat_too_high к DIAG_status_t даст вам DIAG_stat_too_high)

0 голосов
/ 02 ноября 2011

my_func ожидает указатель на функцию, принимающую значение TES_status_t и возвращающую int.

Вы вызываете его с указателем на функцию, принимающую DIAG_status_t и возвращающую int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...