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?

Êtes-vous y compris 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 non
C'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