使用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! Terminate\n");
        exit(0);
        }
    if (my_pid != 0)
        {
        // Parent block
        printf("The parent will Now wait\n");
        wait(NULL);
        printf("Done!\n");
        }
    else
        {
        // Child block
        int resp;
        resp = execvp(*(argv+1),argv+1);
        printf("There was an error. Response code: %d\n Errno: %s\n",resp,stderror(errno));
        }
    }

但是,当我添加#include 时,程序编译时没有警告。为什么不导入sys / wait.h就能首先编译?

解决方法

这是一个“ C”程序,而不是“ C ++”程序。不同的呼叫顺序没有链接。 C最初不需要预先定义被调用的函数。因此,您的编译器仅假设必须有一个可以调用的函数wait并且返回一个整数值。您提供了一个参数NULL,该参数被压入堆栈。

但是,不告诉编译器您正在调用的内容确实是不好的编程习惯,因此您应该包括sys/wait.h