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


202

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

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

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


1
«Почему это не дает версию ошибки»: stackoverflow.com/questions/434763/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

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

Ответы:


231

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

Например:

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

9
В качестве дополнения, если вы дали прототипу проверить, что это не просто опечатка. Также, если это из внешней библиотеки, проверьте, что вы включили его.
Smitec

1
Я не могу запустить код после того, как получаю это предупреждение. Так что ведет себя как ошибка.
Миен

@Flimm, C99 и C89 / C90 имеют разные настройки для этого
как Чен


1
@ZachSaw Совершенно верно. Иначе ты бы не повторился трижды.
Нима Мусави

19

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

пример

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
}

7

Когда вы делаете #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

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

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


2

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

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

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

1

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

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

int main(void) {

   yourfunc();
 }

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.