So lösen Sie die Compiler-Warnung „implizite Deklaration der Funktion memset“

Lesezeit: 3 Minuten

Benutzeravatar von hap497
hap497

Mein C-Code verwendet ‘memset’ und ‘close’. Und ich habe hinzugefügt:

#include <stdio.h>
#include <glib.h>
#include <stdlib.h>

Aber ich bekomme immer noch diese Warnungen:

main.c:259: warning: implicit declaration of function ‘memset’
main.c:259: warning: incompatible implicit declaration of built-in function ‘memset’
main.c:268: warning: implicit declaration of function ‘close’
main.c:259: warning: incompatible implicit declaration of built-in function ‘close’

Können Sie mir bitte sagen, wie ich diese Warnungen beheben kann?

Vielen Dank.

Du brauchst:

#include <string.h> /* memset */
#include <unistd.h> /* close */

in deinem Code.

Referenzen: POSIX für closeder C-Standard für memset.

  • Ja, anfangs hatte ich nur den Titel und den ersten Teil der Warnungen gesehen. Aktualisiert.

    – Alok Singhal

    27. Januar 2010 um 4:44 Uhr

  • +1, um dem Fragesteller mitzuteilen, wo er die Informationen finden kann. @OP: Nicht raten, nachschlagen!

    – Stefan Kanon

    27. Januar 2010 um 5:05 Uhr

  • Das Einschließen von löste auch mein Problem der inkompatiblen impliziten Deklarationswarnung, wenn es um memcpy in GCC 4.8 unter Windows geht.

    – Piotr Lopusiewicz

    28. August 2013 um 17:08 Uhr


  • @PiotrLopusiewicz ja, memcpy() ist auch deklariert string.h: pubs.opengroup.org/onlinepubs/009695399/functions/memcpy.html.

    – Alok Singhal

    28. August 2013 um 20:40 Uhr

  • Richtig, das ist ja im Standard. Ich war überrascht, weil der Visual Studio-Compiler diese Warnung nicht erzeugt.

    – Piotr Lopusiewicz

    28. August 2013 um 20:48 Uhr

Tabithas Benutzeravatar
Tabitha

Ein guter Weg, um herauszufinden, welche Header-Datei Ihnen fehlt:

 man <section> <function call>

Um den Abschnitt herauszufinden, verwenden Sie:

apropos <function call>

Beispiel:

 man 3 memset
 man 2 send

Bearbeiten Sie als Antwort auf James Morris:

  • Abschnitt | Beschreibung
  • 1 Allgemeine Befehle
  • 2 Systemaufrufe
  • 3 C-Bibliotheksfunktionen
  • 4 Spezielle Dateien (normalerweise Geräte, die in /dev zu finden sind) und Treiber
  • 5 Dateiformate und Konventionen
  • 6 Spiele und Bildschirmschoner
  • 7 Verschiedenes
  • 8 Systemverwaltungsbefehle und Daemons

Quelle: Wikipedia-Manpage

  • Erklären Sie vielleicht, warum Abschnitt 3 und Abschnitt 2?

    – James Morris

    27. Januar 2010 um 12:16 Uhr

  • +1 für das Unterrichten, indem Sie uns eine allgemeine Lösung geben, anstatt nur die Lösung zu geben

    – David Guyon

    2. Juni 2014 um 15:11 Uhr

Benutzeravatar von lazybios
faul

memset erfordert, dass Sie den Header importieren string.h Datei. Fügen Sie also einfach den folgenden Header hinzu

#include <string.h>
...

Versuchen Sie, die nächste Definition am Anfang Ihrer .c-Datei hinzuzufügen:

#define _GNU_SOURCE

Es hat mir mit der Pipe2-Funktion geholfen.

Alte Frage, aber ich hatte ein ähnliches Problem und habe es durch Hinzufügen gelöst

extern void* memset(void*, int, size_t);

oder nur

extern void* memset();

oben in der Übersetzungseinheit (*.c-Datei).

  • Nein, du musst #include <string.h> verkünden memset(3).

    – Vonbrand

    24. Februar 2013 um 18:43 Uhr

  • Du kann Bibliotheksfunktionen selbst legal deklarieren (das tun schließlich die Standard-Header), aber es gibt keinen guten Grund dafür.

    – Keith Thompson

    8. Oktober 2013 um 15:59 Uhr

  • Übrigens, memset, memcpy usw. sind nicht immer Bibliotheksfunktionen. Sie können die eingebauten Funktionen eines Compilers sein. Zum Beispiel habe ich keinen Header “string.h” im SDK für mein eingebettetes System. Das Unterdrücken der Warnung ist also die einzige Möglichkeit, das Build-Protokoll zu bereinigen.

    – Pavel Ognew

    4. Juni 2014 um 13:01 Uhr

  • Nein, du musst #include <string.h> verkünden memset(3).

    – Vonbrand

    24. Februar 2013 um 18:43 Uhr

  • Du kann Bibliotheksfunktionen selbst legal deklarieren (das tun schließlich die Standard-Header), aber es gibt keinen guten Grund dafür.

    – Keith Thompson

    8. Oktober 2013 um 15:59 Uhr

  • Übrigens, memset, memcpy usw. sind nicht immer Bibliotheksfunktionen. Sie können die eingebauten Funktionen eines Compilers sein. Zum Beispiel habe ich keinen Header “string.h” im SDK für mein eingebettetes System. Das Unterdrücken der Warnung ist also die einzige Möglichkeit, das Build-Protokoll zu bereinigen.

    – Pavel Ognew

    4. Juni 2014 um 13:01 Uhr

1394320cookie-checkSo lösen Sie die Compiler-Warnung „implizite Deklaration der Funktion memset“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy