waarschuwing: impliciete functieverklaring

Mijn compiler (GCC) geeft me de waarschuwing:

waarschuwing: impliciete functieverklaring

Help me alsjeblieft te begrijpen waarom het komt.


Antwoord 1, autoriteit 100%

U gebruikt een functie waarvoor de compiler nog geen declaratie (“prototype“) heeft gezien.

Bijvoorbeeld:

int main()
{
    fun(2, "21"); /* The compiler has not seen the declaration. */       
    return 0;
}
int fun(int x, char *p)
{
    /* ... */
}

U moet uw functie vóór main declareren, zoals dit, rechtstreeks of in een koptekst:

int fun(int x, char *p);

Antwoord 2, autoriteit 8%

De juiste manier is om het functieprototype in de header te declareren.

Voorbeeld

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

Alternatief met één bestand (main.c)

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

Antwoord 3, autoriteit 3%

Als je #includes doet in main.c, plaats dan de #include verwijzing naar het bestand dat de functie waarnaar wordt verwezen bovenaan de lijst met include.
bijv. Stel dat dit main.c is en de functie waarnaar wordt verwezen in “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

Het bovenstaande zal de fout “Impliciete Verklaring” niet genereren, maar onder Will-

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

exact dezelfde #include lijst, gewoon een andere volgorde.

Nou, het deed voor mij.


4

Als u de correcte gedefinieerde en versterking van de koptekens hebt; Gebruiken een niet GlibC-bibliotheek (zoals musl c ) gccWORDT OOK error: implicit declaration of functionWanneer GNU-extensies zoals malloc_trimONDERSTEUNT.

De oplossing is om wikkel de extensie en versterker; de koptekst :

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

5

U moet de gewenste functie vóór uw Hoofd -functie wijzigen:

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

6

Vergeet niet, als er functies die in uw functie en hun prototypen worden opgeroepen, boven uw functie in de code moeten staan, anders vindt de compiler deze mogelijk niet voordat deze uw functie probeert te compileren. Dit genereert de betreffende fout.


7

Deze fout treedt op omdat u probeert een functie te gebruiken die de compiler niet begrijpt. Als de functie die u probeert te gebruiken is vooraf gedefinieerd in C-taal, neemt u gewoon een header-bestand op dat is gekoppeld aan de impliciete functie.
Als het geen vooraf gedefinieerde functie is, is het altijd een goede gewoonte om de functie vóór de hoofdfunctie te verklaren.


8

Ik denk dat de vraag niet 100% is beantwoord. Ik was op zoek naar kwestie met het ontbrekende Type (), dat compileertijdrichtlijn is.

volgende links schijnen licht op de situatie:

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

probeer vanaf het einde van de sessie __typeof__()te gebruiken. Ook gcc ... -Dtypeof=__typeof__ ...kan helpen.

Other episodes