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


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

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

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

6 156

6 ответов:

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

например:

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

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

пример

главная.h

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

главная.c

#include "main.h"

int main()
{
    some_main("Hello, World\n");
}

int some_main(const char *name)
{
    printf("%s", name);
}

альтернатива с одним файлом (main.в)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}

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

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

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

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

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

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

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

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

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