Предупреждение: неявное объявление функции

Мой компилятор (GCC) дает мне предупреждение:

предупреждение: неявное объявление функции

Пожалуйста, помогите мне понять, почему это происходит.

Ответ 1

Вы используете функцию, для которой компилятор еще не видел объявления ("prototype").

Например:

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);

Ответ 2

Правильный способ - объявить прототип функции в заголовке.

Пример

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
}

Ответ 3

Когда вы делаете #includes в main.c, поместите ссылку #include в файл, содержащий ссылочную функцию в верхней части списка 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, просто другой порядок.

Ну, это было для меня.

Ответ 4

Если вы определили правильные заголовки и используете библиотеку non GlibC (например, Musl C) gcc также будет выбрасывать error: implicit declaration of function, когда встречаются расширения GNU, такие как malloc_trim.

Решение завершает расширение и заголовок:

#if defined (__GLIBC__)
  malloc_trim(0);
#endif

Ответ 5

Когда вы получите error: implicit declaration of function, он также должен указать функцию нарушения. Часто эта ошибка возникает из-за забытого или отсутствующего заголовочного файла, поэтому в командной строке вы можете ввести man 2 functionname и посмотреть в разделе SYNOPSIS вверху, так как в этом разделе будут перечислены любые файлы заголовков, которые необходимо включить. Или попробуйте http://linux.die.net/man/ Это онлайн-страницы, которые они гиперссылки и легко найти. Функции часто определяются в файлах заголовков, в том числе любые требуемые файлы заголовков, часто являются ответами. Как сказал cnicutar,

Вы используете функцию, для которой компилятор не видел декларации ("prototype").

Ответ 6

Я думаю, что на вопрос не на 100%. Я искал проблему с отсутствующим типом(), который является директивой времени компиляции.

Следующие ссылки будут сиять в свете ситуации:

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__ ....

Ответ 7

Это также может произойти, если вы забудете включить заголовочный файл. Например, если вы пытаетесь использовать strlen() без включения string.h, вы получите эту ошибку