没有必要的标题,我的代码怎么能正确编译?

Zhe*_*ren 7 c linux

我使用函数fork(),exec()...

但是如何编译这个程序而不包括一些额外的头文件(比如sys/types.h,sys/wait.h).

我使用ubuntu 10.04和gcc版本4.4.3

#include <stdio.h>
#include <stdlib.h>

int main()
{
 pid_t pid;

 printf("before fork\n");

 pid = fork();

 if(pid == 0)
 {
  /*child*/
  if(execvp("./cpuid", NULL))
  {
   printf("error\n");
   exit(0);
  }
 }
 else
 {
  if(wait(NULL) != -1)
  {
   printf("ok\n");
  }
 }

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 12

在经典的"ANSI"C中,如果在不声明函数的情况下调用函数,则编译器的行为就好像函数被隐式声明为采用固定但未指定数量的参数并返回int.所以,你的代码行为,如果fork()execvp()这样被宣布为:

int fork();
int execvp();
Run Code Online (Sandbox Code Playgroud)

由于execvp()采用固定数量的参数和返回int,因此该声明是兼容的. fork()也需要固定数量的参数,但返回pid_t; 但是因为pid_tint是大多数Linux架构等同类型,该声明是有效地兼容了.

这些函数的实际定义在C标准库中,默认情况下是链接的,因此定义在链接时可用,因此代码可以正常工作.

正如Keith Thompson指出的那样,这种语言特性在C语言标准的C99版本中被删除,而在C99或C11模式下调用的编译器必须至少在未明确声明函数的情况下发出警告.