2012-12-27 4 views
3

Sur mon système errno défini comme:Comprendre C errno

int * __error(void); 
#define errno (* __error()) 

Je comprends errno est une macro et étend à * __error() fonction:

  1. J'ai cherché partout (source sur mon système) mais je ne peut pas trouver la définition de la fonction __error(), quelqu'un peut-il montrer/expliquer ce qui devrait/devrait être la définition de celui-ci?

  2. Comment l'expression errno = 0 fonctionne avec la définition ci-dessus (Affectation 0 à une fonction?)? Est-ce que errno = 0 se développe à * __error() = 0?

Merci

+0

Pour référence, pouvez-vous nous dire ce qu'est "mon système"? –

Répondre

7

La fonction __error renvoie un pointeur sur la variable errno pour le thread appelant. Les déréférences de macro errno pointent, entraînant une lvalue pouvant apparaître de chaque côté d'un signe égal.

Pour répondre à vos questions:

  1. La fonction détermine l'adresse correcte pour la variable errno pour ce thread spécifique. Chaque fil obtient le sien. Oui, il devient (* __error()) = 0; qui affecte 0 à la variable errno de ce thread.

+2

Merci pour votre réponse, cela signifie que quelque part dans ma fonction OS '__error()' a une définition comme 'int * __error() {return &errno;}', ai-je raison? et le 'errno' est' static int errno' dans le fichier .c ?? – Orion

+3

@ManiH .: probablement ce sera un peu plus compliqué, le 'errno' retourné ne sera pas un global, mais proviendra d'un type de stockage local-thread (ie il y a une instance de' errno' pour chaque thread, et l'implémentation '__error()' va récupérer un pointeur sur l'instance par rapport au thread courant). –