erreur: l'utilisation de l'identificateur non déclaré 'errno_t'
Voici ma mort simple code factice:
#include <errno.h>
int main(void)
{
errno_t e;
return 0;
}
Étonnamment génère cette erreur:
main.c:5:5: error: use of undeclared identifier 'errno_t'
errno_t x;
^
J'ai commencé à suivre les traces: lorsque le compilateur voit le <...>
inclusions, il va d'abord chercher à /usr/include
où bien sûr j'ai trouvé errno.h
fichier. En fait il a une seule ligne, en plus de la licence commentaire, qui est:
#include <sys/errno.h>
Maintenant, à /usr/include/sys
dans errno.h
j'ai trouvé les lignes suivantes:
#include <sys/cdefs.h>
#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
#include <sys/_types/_errno_t.h>
#endif
Et à /usr/include/_types
dans _errno_t.h
j'ai trouvé ceci:
typedef int errno_t;
De sorte qu'il ressemble, il est là, et c'est un alias du type entier, et une partie de la errno.h
-- juste comme il se doit.
Alors pourquoi n'est-il pas inclus? Pourquoi le compilateur soulève l'identificateur non déclaré erreur?
Merci d'avance!
INFORMATIONS PERTINENTES:
Compiler:
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)`
Compiler flags:
-std=c11 -I/usr/include/sys -I/usr/local/include
La macro variable __STDC_WANT_LIB_EXT1__
seront définies lors de /usr/include/sys
dans cdefs.h
dans les lignes suivantes:
/* If the developer has neither requested a strict language mode nor a version
* of POSIX, turn on functionality provided by __STDC_WANT_LIB_EXT1__ as part
* of __DARWIN_C_FULL.
*/
#if !defined(__STDC_WANT_LIB_EXT1__) && !defined(__STRICT_ANSI__) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL
#define __STDC_WANT_LIB_EXT1__ 1
#endif
Mise à JOUR:
@PaulR dit dans la section des commentaires: si je supprime le -std=c11
drapeau, il compile. Ce qui est tout aussi surprenant que l'erreur déclenchée si le drapeau a été inclus. J'ai donc étendre cette question avec une sous-question:
N'est pas errno_t
partie de la norme C11, ou pourquoi n'est-il pas inclus, lorsque la norme est spécifié pour le compilateur?
cdefs.h
(directement ou par l'intermédiaire d'autres)? __STDC_WANT_LIB_EXT1__
est défini sur une condition. Cette condition remplie?mis à jour le post -- le
/usr/include/sys/errno.h
a l'inclusion avant qu'il vérifie si la var est définie ou nonC'est parce que vous êtes à la compilation avec
-std=c11
- l'enlever, ou utiliser le moins strictes -std=gnu11
, et de compiler l'amende juste.puis-je mettre à jour la question. Merci @PaulR!
Non, c'est la partie de l'Annexe K, ce qui n'est pas normatif, sauf pour les implémentations qui prétendent soutenir.
OriginalL'auteur Peter Varo | 2014-06-13
Vous devez vous connecter pour publier un commentaire.
errno_t
n'est pas un type standard; il fait partie de l'option (et largement impopulaire et non pris en charge) de l'Annexe K, inclus avec la norme ISO C11 seulement parce que d'un fournisseur qui avec une histoire de l'ignorer et de saboter la norme.Depuis l'Annexe K définit
errno_t
commeint
, le type de laerrno
objet estint
, et tous les codes d'erreur sontint
, il suffit d'utiliserint
dans vos programmes. C'est beaucoup plus portable que de compter sur une fonction optionnelle qui est peu probable d'être pris en charge.Donnez-leur le temps - ça a pris 15 ans pour eux de se familiariser avec le C99!
Le plus gros problème est qu'ils ont mis un point d'essayer d'imposer leur inutile ajouts à la langue dans une norme qu'ils n'ont aucun intérêt ou de l'intention dans la suite. Ce n'est pas la façon dont les normes sont censés travailler. Si vous ne voulez pas suivre la norme, vous ne devriez pas participer en essayant de forme.
OriginalL'auteur R..