Разница между ожиданием в stdlib.h и sys / wait - PullRequest
3 голосов
/ 06 сентября 2011

Я почти уверен, что есть такой вопрос, но я не могу его найти: \ Во всяком случае, вот проблема:

В чем разница между wait в stdlib.h и sys/wait.h o.O?


Подробно - я только что столкнулся с этой проблемой и не смог скомпилировать простую программу на Си. Я выделил проблему и вот что я получил:

#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’

Что декларация ? О. Что здесь wait, что конфликтует с int status?

Я нашел нить в сети, где замена stdlib.h на sys/wait.h решает проблему, но почему это так и в чем разница?


РЕДАКТИРОВАТЬ : Благодаря комментарию Сидилла я изменил расширение файла - с .cpp на .c , и оно заработало ! Я в шоке :) Чем это так отличается? И все тот же вопрос - чем отличаются эти два wait -s?

Ответы [ 3 ]

3 голосов
/ 06 сентября 2011

Я сделал gcc -E wait.cpp, чтобы вывести фактические расширения препроцессора, которые имеют место.Я обнаружил, что в linux включен заголовок /usr/include/bits/waitstatus.h, который извлекает union wait { ... }, но функция wait () из sys / wait.h никогда не включается. То же самое происходит с компиляцией c, нопо какой-то причине компилятор не будет жаловаться в этом случае.

Чтобы доказать это себе, вы можете изменить свой main, объявив ожидание как переменную, а не вызов функции, и компилятор не будет жаловаться:

int main() {
    int status;
    wait w;
    return 0;
}
2 голосов
/ 06 сентября 2011

Разница в том, что wait() в <sys/wait.h> - это то, что вы должны использовать.

со страницы руководства wait(3):

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

       pid_t wait(int *status);

Функция wait не определена стандартом ISO C, поэтому соответствующая реализация C не может объявить ее в <stdlib.h> (поскольку для программы разрешено использовать имя wait для ее собственные цели). gcc с glibc, очевидно, делает это в режиме по умолчанию, но если вы вызываете его с помощью gcc -ansi -pedantic или gcc -std=c99 -pedantic, он не распознает имя функции wait или тип pid_t.

1 голос
/ 06 сентября 2011

Обратите внимание, что GCC означает Коллекция компиляторов GNU , а не компилятор GNU C (как и многие другие инструменты, для которых был установлен префикс g ).Это не компилятор C-only.И многие языки обнаруживаются по расширениям файлов.Адам Розенфилд частично прав в своем комментарии.Да, 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.hhor.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
namegcc).

Итак, "GCC повторно регистрирует файлы с этими именами", и ваша программа компилируетсякак источник C ++.Я предполагаю, что в C ++ есть какое-то специальное использование &, чего я точно не могу сказать (я не знаю C ++).Отсюда ошибка.

Теперь, что касается разницы между g++ и gcc, перейдите к следующему абзацу:

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

По реальному вопросу: в моей системе нет двух wait с (Дарвин 11),только стандартный системный вызов.Проверьте, не происходит ли то, что сказал Кевин.То же самое, stdlib.h включает sys / wait.h :

#include <_types.h>
#if !defined(_ANSI_SOURCE)
#include <sys/wait.h>
#if (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
#include <alloca.h>
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#endif /* !_ANSI_SOURCE */

Проверьте свой заголовок.

...