попередження: неявне оголошення функції


201

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

попередження: неявне оголошення функції

Будь ласка, допоможіть мені зрозуміти, чому це відбувається.


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

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

Відповіді:


230

Ви використовуєте функцію, для якої компілятор ще не бачив декларації (" прототип ").

Наприклад:

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

9
Як доповнення, якщо ви дали прототипу, перевірте, що це не просто друкарська помилка. Крім того, якщо його із зовнішньої бібліотеки перевірте, що ви її включили.
smitec

1
Я не можу запустити код після отримання цього попередження. Тож воно поводиться як помилка.
Мінь

@Flimm, C99 та C89 / C90 має для цього різні налаштування
How Chen


1
@ZachSaw Правильно. Інакше ти б не повторив себе тричі.
Німа Мусаві

19

Правильний спосіб - оголосити прототип функції в заголовку.

Приклад

головний.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

Коли ви робите #includes в 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/ Це інтернет-сторінки, на яких вони пов’язані гіперпосиланнями та прості в пошуку. Функції часто визначаються у файлах заголовків, у тому числі будь-які потрібні файли заголовків часто є відповіддю. Як сказав цинкутар,

Ви використовуєте функцію, для якої компілятор ще не бачив декларації ("прототип").


2

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

Рішення полягає в обгортанні розширення та заголовка :

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