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

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

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

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

10 ответов

Решение

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

Например:

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, просто другой порядок.

Ну, это сделал для меня.

Вам нужно объявить желаемую функцию перед основной функцией:

#include <stdio.h>
int yourfunc(void);

int main(void) {

   yourfunc();
 }

Когда вы получите 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

Эта ошибка возникает из-за того, что вы пытаетесь использовать функцию, которую компилятор не понимает. Если функция, которую вы пытаетесь использовать, предопределена на языке C, просто включите файл заголовка, связанный с неявной функцией. Если это не предопределенная функция, то всегда рекомендуется объявлять функцию перед основной функцией.

Компилятор GNU C сообщает вам, что он может найти это конкретное имя функции в области действия программы. Попробуйте определить ее как частную функцию-прототип в файле заголовка, а затем импортируйте ее в основной файл.

Я думаю, что на этот вопрос нет 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

по убеждению попробуйте использовать __typeof__() вместо. Также gcc ... -Dtypeof=__typeof__ ... может помочь.

Другие вопросы по тегам