尝试使用execvpe(...)但得到隐式声明错误 - 即使我认为我正在使用正确的参数类型

new*_*bie 4 c linux posix exec unistd.h

我编译时收到以下警告:

execute.c:20:2: warning: implicit declaration of function ‘execvpe’[-Wimplicit-function-declaration] execvpe("ls", args, envp);
Run Code Online (Sandbox Code Playgroud)

^

我的理解是,当您尝试使用的函数具有不正确类型的参数时,会发生这种情况.但是,我很确定我正在提供正确的参数:

int execvpe(const char *file, char *const argv[], char *const envp[]);
Run Code Online (Sandbox Code Playgroud)

Linux手册页中所述

以下是我的代码的相关部分:

#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>

void test_execvpe(char* envp[])
{
    const char* temp = getenv("PATH");
    char path[strlen(temp)+1];
    strcpy(path, temp);
    printf("envp[%d] = %s\n", 23, envp[23]); //print PATH
    char* args[] = {"-l", "/usr", (char*) NULL};
    execvpe("ls", args, envp);
}

int main( int argc, char* argv[], char* envp[])
{

    //test_execlp();
    test_execvpe(envp);
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我一直收到这个错误?谢谢!

mis*_*mer 9

"隐式函数声明"表示编译器没有看到该函数的声明.大多数编译器(包括gcc)都会假设函数的使用方式是正确的,返回类型是int.这通常是个坏主意.即使您正确使用了参数,它仍然会抛出此错误,因为编译器不知道您正在使用参数.execvpe只有_GNU_SOURCE在包含unistd.h之前定义声明才包含声明,因为它是GNU扩展.

你会想要这样的东西:

#define _GNU_SOURCE
#include <unistd.h>
Run Code Online (Sandbox Code Playgroud)