c-带有wait()的程序在不包含sys/wait.h的情况下编译,并带有隐式声明警告



我有一个简单的C程序,它可以调用wait((函数。然而,我的程序不包括sys/wait.h。它仍然可以编译并正常工作。它的工作本质上是用命令行参数重写进程映像。

在编译过程中,我收到以下警告:

my_program.c:在函数"main"中警告:函数"wait"的隐式声明,你的意思是"main"吗?

我的程序是这样的。。。它做的正是我想要它做的。我只是不知道为什么在我不包括它的情况下,wait((仍然被定义。

#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
pid_t my_pid;
my_pid = fork();
if (my_pid < 0)
{
printf("The fork didn't work! Terminaten");
exit(0);
}
if (my_pid != 0)
{
// Parent block
printf("The parent will now waitn");
wait(NULL);
printf("Done!n");
}
else
{
// Child block
int resp;
resp = execvp(*(argv+1), argv+1);
printf("There was an error. Response code: %dn Errno: %sn", resp, stderror(errno));
}
}

然而,当我添加#include<sys/wait.h>,程序编译时没有任何警告。为什么它能够在一开始就编译,而不导入sys/wait.h?

这是一个"C";程序,而不是";C++";程序不同的调用序列没有关联。C最初并不要求被调用的函数是预定义的。因此,编译器只是假设必须有一个可以调用的函数wait,并且它返回一个整数值。您提供了一个参数NULL,它被推送到堆栈上。

然而,不告诉编译器您正在调用什么是非常糟糕的编程实践,因此您应该包含sys/wait.h

最新更新