предупреждение: неявное объявление функции - PullRequest
164 голосов
/ 09 декабря 2011

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

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

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

Ответы [ 6 ]

197 голосов
/ 09 декабря 2011

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

Например:

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);
16 голосов
/ 03 декабря 2014

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

Пример

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
}
6 голосов
/ 09 ноября 2016

Когда вы делаете #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, просто другой порядок.

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

3 голосов
/ 26 ноября 2015

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

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

2 голосов
/ 29 августа 2015

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

Решение состоит в том, чтобы обернуть расширение и заголовок :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif
0 голосов
/ 17 марта 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...