2017-04-12 1 views
0

Ich teste die execvpe() in c, ich versuchte den untenstehenden Code, der den Fehler verursacht, da "implizite Deklaration der Funktion 'execvpe' in C99 [-Wimplicit-function-declaration] ungültig ist" .execvpe implizite Deklarationsfehler

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define _GNU_SOURCE 
#include <unistd.h> 

int main(int argc, char const *argv[]) 
{ 
    //execl("/bin/echo", "echo", "Hello, world", NULL); 
    char *path = getenv("PATH"); 
    char pathenv[strlen(path) + sizeof("PATH=")]; 
    sprintf(pathenv, "PATH=%s", path); 
    char *envp[] = {pathenv, NULL}; 
    char *tests[] = {"ls", "-lR", NULL}; 
    execvpe(tests[0], tests, envp); 
    fprintf(stderr, "failed to execute \"%s\"\n", tests[0]); 
    return 0; 
} 

Dann teste ich diesen Code wie unten den bestehenden Status zu testen (die ich von Compiler warnings for execvpe function kopiert, diesmal keinen Fehler. Gibt es jemand kann mir helfen, herauszufinden, was in meinem obigen Code falsch? Vielen Dank!

#include <unistd.h> 
extern int execvpe(const char *file, char *const argv[], char *const envp[]); 

Antwort

0

Bewegen Sie den #define _GNU_SOURCE Richtlinie vor einem der #include Richtlinien, zB

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

In Glibc, alle diese Header Ziehen Sie features.h, die verschiedene Makros basierend auf der Einstellung _XOPEN_SOURCE, _POSIX_SOURCE, _GNU_SOURCE, etc. Zum Zeitpunkt der ersten enthält, ist es nicht festgelegt. Wenn Sie zu unistd.h gelangen, ist features.h bereits enthalten und wird nicht erneut angewendet.

+0

Vielen Dank! Nachdem ich es verschoben habe, hat es den Fehler wie "Fehler: implizite Deklaration der Funktion 'execvpe' ist ungültig in C99 [-Werror, -Wimplicit-Funktion-Deklaration] Execvpe (Tests [0], Tests, envp);" – coco

+0

@coco Es funktioniert hier mit GCC 6.3.1 und Glibc 2.25. Verwenden Sie möglicherweise eine andere C-Standardbibliothek, die nicht 'execvpe' enthält? – ephemient

+0

Sie können eine Demonstration des Fehlens von Warnungen online hier sehen: https://godbolt.org/g/m2eyRi – ephemient