Как мой код мог скомпилировать правильно без необходимых заголовков?

Я использую ветвление функций (), должностное лицо ()...

Но как эта программа может быть скомпилирована без включения некоторых дополнительных заголовков (как sys/types.h, sys/wait.h).

Я использую человечность 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;
}
7
задан Péter Török 17 May 2010 в 09:39
поделиться

2 ответа

В классическом "ANSI" C, если вы вызываете функцию без ее объявления, компилятор ведет себя так, как если бы функция была неявно объявлена, чтобы принимать фиксированное, но не указанное количество аргументов и возвращать int . Таким образом, ваш код действует так, как если бы fork () и execvp () были объявлены следующим образом:

int fork();
int execvp();

Поскольку execvp () принимает фиксированное количество аргументов и возвращает int , это объявление совместимо. fork () также принимает фиксированное количество аргументов, но возвращает pid_t ; однако, поскольку pid_t и int являются эквивалентными типами на большинстве архитектур Linux, это объявление также эффективно совместимо.

Фактические определения этих функций находятся в стандартной библиотеке C, которая связана по умолчанию, поэтому определение доступно во время компоновки и, таким образом, код работает.

Как отмечает Кейт Томпсон, эта языковая функция была исключена в версии C99 стандарта языка C, и компиляторы, вызываемые в режиме C99 или C11, должны, по крайней мере, выдавать предупреждение, когда функция вызывается без явного объявления.

12
ответ дан 6 December 2019 в 10:48
поделиться

exec и fork объявлены в unistd.h, который, скорее всего, включен в один, если stdio.h или stdlib.h, которые вы явно указали в своем коде. "wait" взято из sys / wait.h ... Попробуйте вызвать gcc с помощью -c -E , чтобы сгенерировать предварительно обработанный вывод и посмотреть, откуда берутся объявления функций.

3
ответ дан 6 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: