Différence entre attendre dans stdlib.h et sys / wait

Je suis quasiment sûr qu’il y a une telle question, mais je ne le trouve pas: \ Quoi qu’il en soit, voici le problème:

Quelle est la différence entre wait dans stdlib.h et sys/wait.h oO?


Dans les détails – je viens de rencontrer ce problème et je ne pouvais pas comstackr un programme C simple. J’ai isolé le problème et voici ce que j’ai eu:

 #include  //#include  int main() { int status; wait( &status ); return 0; } 

Si stdlib.h est inclus, j’ai:

 $ 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' 

Quelle déclaration ? Oo Qu’est-ce que l’ wait ici, qui entre en conflit avec le int status ?

J’ai trouvé un fil dans le net, où remplacer stdlib.h par sys/wait.h résout le problème, mais pourquoi et quelle est la différence?


EDIT : Grâce au commentaire de sidyll, j’ai changé l’extension de fichier – de .cpp à .c et ça a fonctionné ! Je suis choqué 🙂 Comment est-ce si différent? Et toujours la même question – quelle est la différence entre ces deux wait ?

La différence est que l’ wait() dans est celle que vous devez utiliser.

De la page de manuel wait(3) :

 SYNOPSIS #include  #include  pid_t wait(int *status); 

La fonction wait n’est pas définie par la norme ISO C, donc une implémentation C conforme n’est pas autorisée à la déclarer dans (car il est légal qu’un programme utilise ce nom pour ses propres besoins). gcc avec glibc le fait apparemment dans son mode non conforme par défaut, mais si vous l’invoquez avec gcc -ansi -pedantic ou gcc -std=c99 -pedantic , il ne reconnaît pas le nom de la fonction wait ou le type pid_t .

J’ai fait gcc -E wait.cpp pour récupérer les extensions du préprocesseur. Ce que j’ai trouvé, c’est que sous linux, l’en-tête /usr/include/bits/waitstatus.h est inclus, ce qui entraîne une union wait { ... } mais la fonction wait () de sys / wait.h n’est jamais extraite. La même chose se produit avec la compilation c, mais pour une raison quelconque, le compilateur ne se plaint pas dans ce cas.

Pour vous le prouver, vous pouvez changer votre main pour déclarer l’attente comme une variable plutôt qu’un appel de fonction, et le compilateur ne se plaindra pas:

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

Notez que GCC signifie GNU Comstackr Collection , pas GNU C Comstackr (comme de nombreux autres outils avec un préfixe g ). Ce n’est pas un compilateur C-only. Et de nombreuses langues sont détectées par les extensions de fichiers. Adam Rosenfield est partiellement correct dans son commentaire. Oui, g++ appenda la bibliothèque C ++ dans la phase de l’éditeur de liens, mais ce n’est pas la différence unique (plus de détails plus tard).

Pour expliquer comment l’extension de l’extension l’a résolue, veuillez jeter un coup d’œil dans ce texte directement depuis le manuel de 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 or .H; and
preprocessed C++ files use the suffix .ii. GCC recognizes files with
these names and comstacks them as C++ programs even if you call the
comstackr the same way as for compiling C programs (usually with the
name gcc).

Ainsi, “GCC ré-enregistre les fichiers avec ces noms” et votre programme a été compilé en tant que source C ++. Je suppose que C ++ a un usage particulier de & , que je ne peux pas dire exactement (je ne connais pas le C ++). D’où l’erreur.

Maintenant, concernant la différence entre g++ et gcc , continuez avec le paragraphe suivant:

However, the use of gcc does not add the C++ library. g++ is a program
that calls GCC and treats files as C++ source files .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 extension for use in C++ .h extension for use in C++
compilations. On many systems, compilations. On many systems, g++ is also installed with the name
c++.

Sur la vraie question: il n’y a pas deux temps d’ wait dans mon système (Darwin 11), seul l’appel système standard. Vérifiez si ce que Kevin a dit ne se passe pas. C’est la même chose, stdlib.h inclut sys / wait.h :

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

Vérifiez votre en-tête.