Мой компилятор (GCC) выдает мне предупреждение:
предупреждение: неявное объявление функции
Пожалуйста, помогите мне понять, почему это происходит.
Мой компилятор (GCC) выдает мне предупреждение:
предупреждение: неявное объявление функции
Пожалуйста, помогите мне понять, почему это происходит.
Ответы:
Вы используете функцию, для которой компилятор еще не видел объявление (« прототип »).
Например:
int main()
{
fun(2, "21"); /* The compiler has not seen the declaration. */
return 0;
}
int fun(int x, char *p)
{
/* ... */
}
Вам нужно объявить вашу функцию перед main, как это, либо напрямую, либо в заголовке:
int fun(int x, char *p);
Правильный путь - объявить прототип функции в заголовке.
main.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
}
Когда вы делаете #include в 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/ Это справочные страницы в Интернете, на которые они ссылаются и которые легко найти. Функции часто определяются в заголовочных файлах, включая ответы на любые требуемые заголовочные файлы. Как сказал Cnicutar,
Вы используете функцию, для которой компилятор еще не видел объявление («прототип»).
Если у вас определены правильные заголовки, и вы используете не GlibC
библиотеку (такую как Musl C ), то gcc
будет также выдаваться, error: implicit declaration of function
когда расширения GNU, такие какmalloc_trim
обнаружении .
Решение - обернуть расширение и заголовок :
#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__ ...
может помочь.