GCC, как остановить ложное положительное предупреждение неявного объявления функций для функций в ПЗУ? - PullRequest
2 голосов
/ 29 апреля 2019

Я хочу избавиться от всех предупреждений объявления неявных функций в моей кодовой базе.Но есть проблема, потому что некоторые функции запрограммированы в ПЗУ микроконтроллера на заводе-изготовителе и при связывании сценария компоновщика предоставляет только адрес функции.Эти функции вызываются кодом в SDK.

Во время компиляции gcc, конечно, выдает предупреждение implicit-function-declaration.Как мне избавиться от этого предупреждения?

Чтобы было ясно, я понимаю, почему предупреждение есть и что оно означает.Но в этом конкретном случае разработчики SDK гарантируют, что код будет работать с неявными правилами (т.е. неявная функция принимает только целые числа и возвращает целое число).Таким образом, это предупреждение является ложным срабатыванием.

Это только gnu-C-99, без c ++.

Идеи:

  • Угадайте типы аргументов, напишитепрототип в заголовке и включить что?
  • Скажите gcc, что нужно рассматривать такие функции как ложные срабатывания с некоторым атрибутом gcc?

Ответы [ 4 ]

2 голосов
/ 29 апреля 2019

Вы можете создать функцию-прототип в заголовке или подавить предупреждения следующим образом:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
/* line where GCC complains about implicit function declaration */
#pragma GCC diagnostic pop
0 голосов
/ 29 апреля 2019

Напишите небольшую программу, которая генерирует файл заголовка romfunctions.h из сценария компоновщика, с такой строкой

int rom_function();

для каждого символа, определенного в ПЗУ.Запустите эту программу из ваших Makefiles.Измените все файлы, которые используют эти функции, на romfunctions.h.Таким образом, если скрипт компоновщика изменяется, вам не нужно обновлять файл заголовка вручную.

0 голосов
/ 29 апреля 2019

C не требует, чтобы объявления были прототипами, поэтому вы можете избавиться от проблемы (которая должна быть трудная ошибка , а не предупреждение, поскольку неявные объявления не являются допустимыми C), используя не объявление прототипа, требующее знания только возвращаемого типа. Например:

int foo();

Поскольку "неявные объявления" исторически считались возвращающими int, вы можете просто использовать int для всех них.

0 голосов
/ 29 апреля 2019

[Полностью написано из-за комментариев]

Вы компилируете SDK поставщика с вашим собственным кодом. Обычно это не то, что вы хотите.

Что вы делаете, вы создаете их файлы SDK с gcc -c -Wno-implicit-function-declaration, а ваши собственные файлы с gcc -c или, возможно, gcc -o output all-your-c-files all-their-o-files.

...