我很确定有这样的问题,但我找不到它:\无论如何,这是问题:
wait
中的stdlib.h
与sys/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之间有什么不同?
答案 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显然是在默认的不符合模式下执行此操作,但如果使用wait
或gcc -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
检查标题。