【问题标题】:Program with wait() compiles without including sys/wait.h, with implicit declaration warning [duplicate]带有 wait() 的程序在不包含 sys/wait.h 的情况下编译,并带有隐式声明警告 [重复]
【发布时间】:2020-10-13 18:51:50
【问题描述】:

我有一个简单的 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 就可以编译?

【问题讨论】:

  • 你运行什么命令来编译程序? wait() 函数的定义很可能是在另一个翻译单元中编译的(即 sys/wait.c 是单独编译的)。编译器只会警告你,因为你没有在main 程序中明确提到你想使用这个函数。
  • "它仍然可以编译并且工作正常" -- 不,它会在编译期间发出警告。在某些情况下可能可以接受,但这清楚地表明事情并不“好”。
  • @mercury0114 我正在用“gcc my_program.c”编译它,没有其他会影响实际编译的参数。
  • @JohnBollinger 通过“编译和工作正常”我的意思是在执行过程中无论是否包含 sys/wait.h 都没有明显差异
  • 我不怀疑程序无论哪种方式都可以工作,但是编译器已经明确告诉您,当不包含标头时,您的代码存在问题。我确定我听起来很挑剔,但很难低估关注编译器警告的重要性。在这种情况下,它恰好可以工作,因为您的编译器提供了一个扩展来支持遗留代码,而 wait() 函数恰好有一个可以利用它的签名。你不会总是那么幸运。

标签: c linux posix


【解决方案1】:

这是一个“C”程序,而不是“C++”程序。不同的调用序列没有链接。 C 最初并不要求预先定义被调用的函数。所以你的编译器只是假设必须有一个可以调用的函数wait 并且它返回一个整数值。您提供一个参数NULL,它被压入堆栈。

但是,不告诉编译器你在调用什么是非常糟糕的编程习惯,所以你应该包括sys/wait.h

【讨论】:

  • gcc如何将未声明的wait()函数与库中未包含的wait()函数连接起来?
  • gcc 没有连接它。链接器连接它。那是一个名为ld 的程序。 gcc 创建一个目标文件,链接器链接并生成一个可执行文件。
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多