Предотвращение передачи несовместимого типа указателя - PullRequest
0 голосов
/ 10 января 2019
typedef struct A {} A;
typedef struct B {} B;

void doStuff(A* pA) {};

int main() {
   B b;
   doStuff(&b);
}

Этот код компилируется (хотя и с предупреждением). Есть ли способ (опция компилятора или, возможно, путем изменения определения doStuff), чтобы он не компилировался?

1 Ответ

0 голосов
/ 10 января 2019

Редактировать: вы можете сделать определенные предупреждения, которые рассматриваются как ошибки в GCC / Clang, с этим флагом: -Werror=<warning name>.

Вы можете рассматривать предупреждения как ошибки в GCC (или Clang), используя флаг -Werror. Другие компиляторы имеют свои собственные соответствующие флаги.

Тогда вы получите что-то вроде этого:

prog.c: In function 'doStuff':
prog.c:4:17: error: unused parameter 'pA' [-Werror=unused-parameter]
    4 | void doStuff(A* pA) {};
      |              ~~~^~
prog.c: In function 'main':
prog.c:8:12: error: passing argument 1 of 'doStuff' from incompatible pointer type [-Werror=incompatible-pointer-types]
    8 |    doStuff(&b);
      |            ^~
      |            |
      |            B * {aka struct B *}
prog.c:4:17: note: expected 'A *' {aka 'struct A *'} but argument is of type 'B *' {aka 'struct B *'}
    4 | void doStuff(A* pA) {};
      |              ~~~^~
cc1: all warnings being treated as errors

Демонстрация в реальном времени

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