在stdlib.h和sys / wait中等待的区别

时间:2011-09-06 18:42:29

标签: c unix posix wait

我很确定有这样的问题,但我找不到它:\无论如何,这是问题:

wait中的stdlib.hsys/wait.h o.O之间有什么区别?


详细说明 - 我刚刚遇到这个问题,我无法编译一个简单的C程序。我解决了问题,这就是我得到的:

#include <stdlib.h>
//#include <sys/wait.h>

int main()
{
    int status;
    wait( &status );

    return 0;
}

如果包含stdlib.h,我得到了:

$ gcc asd.cpp 
asd.cpp: In function ‘int main()’:
asd.cpp:9:16: error: conflicting declaration ‘wait& status’
asd.cpp:8:6: error: ‘status’ has a previous declaration as ‘int status’

声明是什么? O.o这里的wait是什么,与int status冲突?

我在网络中找到了一个帖子,用stdlib.h替换sys/wait.h解决了问题,但为什么会这样,有什么区别?


编辑 :感谢sidyll的评论,我更改了文件扩展名 - 从.cpp改为.c 工作!我很震惊:)这有什么不同?还有同样的问题 - 这两个wait - s之间有什么不同?

3 个答案:

答案 0 :(得分:3)

我做了gcc -E wait.cpp来转储发生的实际预处理器扩展。我发现在linux上,包含了标题/usr/include/bits/waitstatus.h,它引入了union wait { ... }但是从sys / wait.h中的函数wait()从未被拉入。同样的事情发生在c编译,但无论出于何种原因,编译器在这种情况下都不会抱怨。

为了向自己证明这一点,你可以改变你的main来将wait声明为变量而不是函数调用,编译器不会抱怨:

int main() {
    int status;
    wait w;
    return 0;
}

答案 1 :(得分:2)

区别在于wait()中的<sys/wait.h>是您应该使用的。{/ p>

来自wait(3)手册页:

SYNOPSIS
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);

{C}标准未定义wait函数,因此不允许符合条件的C实现在<stdlib.h>中声明它(因为程序使用该名称是合法的{ {1}}为了自己的目的)。带有glibc的gcc显然是在默认的不符合模式下执行此操作,但如果使用waitgcc -ansi -pedantic调用它,则它无法识别函数名gcc -std=c99 -pedantic或类型{{ 1}}。

答案 2 :(得分:1)

请注意,GCC代表 GNU编译器集合,而非GNU C编译器(尽可能多) 其他以 g 为前缀的工具。它不是一个只有C的编译器。和 文件扩展名检测到许多语言。亚当罗森菲尔德是偏爱的 他的评论是正确的。是的,g++将在链接器阶段添加C ++库, 但这不是唯一的区别(稍后会详细介绍)。

要解释更改扩展如何解决它,请查看此文本 直接来自GCC的手册:

  

Compiling C++ Programs

     

C++ source files conventionally use one of the suffixes .C, .cc, .cpp,
  的 .CPP, .c++, .cp, or .cxx; C++ header files often use .hh {{1} }的 or .H;
  and
  preprocessed C++ files use the suffix .ii. GCC recognizes files with
  these names and compiles them as C++ programs even if you call the
  compiler the same way as for compiling C programs (usually with the name

所以,“GCC用这些名称重新定位文件”,你的程序正在编译中 作为C ++源码。我猜C ++有一些gcc).的特殊用法,我无法分辨 确切地说(我不知道C ++)。因此错误。

现在,关于&g++之间的区别,请继续下一步 段:

  

gcc However, the use of gcc does not add the C++ library. g++
  is a program that calls GCC and treats .c, .h and .i
  files as C++ source files instead of C source files unless -x
  is used, and automatically
  specifies linking against the C++ library. This program is also useful when precompiling a C header file with a .h
  extension for use in C++ compilations. On many systems, g++
  的 is also installed with the name

关于真正的问题:我的系统(达尔文11)中只有两个c++. 标准的系统调用。检查凯文所说的是不是发生了什么。一样的, stdlib.h 包括 sys / wait.h

wait

检查标题。