Мій упорядник (GCC) попереджає мене:
попередження: неявне оголошення функції
Будь ласка, допоможіть мені зрозуміти, чому це відбувається.
Мій упорядник (GCC) попереджає мене:
попередження: неявне оголошення функції
Будь ласка, допоможіть мені зрозуміти, чому це відбувається.
Відповіді:
Ви використовуєте функцію, для якої компілятор ще не бачив декларації (" прототип ").
Наприклад:
int main()
{
fun(2, "21"); /* The compiler has not seen the declaration. */
return 0;
}
int fun(int x, char *p)
{
/* ... */
}
Вам потрібно оголосити свою функцію перед головним, як це, безпосередньо або в заголовку:
int fun(int x, char *p);
Правильний спосіб - оголосити прототип функції в заголовку.
головний.h
#ifndef MAIN_H
#define MAIN_H
int some_main(const char *name);
#endif
main.c
#include "main.h"
int main()
{
some_main("Hello, World\n");
}
int some_main(const char *name)
{
printf("%s", name);
}
Альтернатива з одним файлом (main.c)
static int some_main(const char *name);
int some_main(const char *name)
{
// do something
}
Коли ви робите #includes в main.c, покладіть посилання #include на файл, що містить функцію, на яку посилається, вгорі списку включення. Наприклад, скажіть, що це main.c, і ваша посилана функція знаходиться в "SSD1306_LCD.h"
#include "SSD1306_LCD.h"
#include "system.h" #include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h> // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h" // This has the 'BYTE' type definition
Вищезазначене не призведе до помилки "неявного оголошення функції", але нижче буде
#include "system.h"
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h> // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h" // This has the 'BYTE' type definition
#include "SSD1306_LCD.h"
Точно той самий список #include, просто інший порядок.
Ну, це зробило для мене.
Коли ви отримаєте його, error: implicit declaration of function
він також повинен перелічити функцію-порушника. Часто ця помилка трапляється через забутий або відсутній файл заголовка, тому в запиті оболонки ви можете ввести man 2 functionname
та подивитися SYNOPSIS
розділ вгорі, оскільки в цьому розділі будуть перераховані всі файли заголовків, які потрібно включити. Або спробуйте http://linux.die.net/man/ Це інтернет-сторінки, на яких вони пов’язані гіперпосиланнями та прості в пошуку. Функції часто визначаються у файлах заголовків, у тому числі будь-які потрібні файли заголовків часто є відповіддю. Як сказав цинкутар,
Ви використовуєте функцію, для якої компілятор ще не бачив декларації ("прототип").
Якщо у вас визначені правильні заголовки, і ви використовуєте небібліотекуGlibC
(наприклад, Musl C ), gcc
вона також викине, error: implicit declaration of function
коли malloc_trim
зустрічаються розширення GNU, такі як .
Рішення полягає в обгортанні розширення та заголовка :
#if defined (__GLIBC__)
malloc_trim(0);
#endif
Я думаю, що на питання не на 100% відповіли. Я шукав проблему з відсутнім typeof (), що є тимчасовою директивою компіляції.
Наступні посилання висвітлюють ситуацію:
https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html
https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords
на зміну спробуйте використовувати __typeof__()
замість цього. Також gcc ... -Dtypeof=__typeof__ ...
може допомогти.