J'essaie de comprendre comment la glibc initialise errno
sans le préprocesseur en remplaçant le symbole errno
.Comment errno thread-safe est-il initialisé si #define remplace le symbole errno?
J'ai d'abord essayé de mettre en œuvre une version simple moi-même basée sur csu/errno-loc.c et csu/errno.c:
myerrno.h
#ifndef MYERRNO_H
#define MYERRNO_H
extern int *myerrno_location(void);
#define myerrno (*myerrno_location())
#endif
myerrno.c
#include "myerrno.h"
static int myerrno = 0;
int *myerrno_location(void){
return &myerrno;
}
Toutefois, lorsque J'essaie de compiler je reçois l'erreur suivante m essages:
myerrno.c:3:1: error: function ‘myerrno_location’ is initialized like a variable
myerrno.c:3:12: error: static declaration of ‘myerrno_location’ follows non-static declaration
myerrno.h:4:13: note: previous declaration of ‘myerrno_location’ was here
Je peux dire que le préprocesseur est substituait (*myerrno_location(void))
lorsqu'il rencontre myerrno
sur la ligne 3 - et naturellement ce comportement est normal. Je ne comprends pas pourquoi ce n'est pas un problème pour glibc. Comment les implémentations thread-safe de errno
contourner ce problème de substitution de préprocesseur sans renommer la variable statique errno
?
ce fil est-il utile? http://stackoverflow.com/questions/1694164/is-errno-thread-safe – DRC
Dans le code threadé, il n'y a pas un seul emplacement pour une variable 'errno'; il y a une variable par thread, et la fonction cachée derrière la macro est responsable de renvoyer un pointeur vers la variable spécifique au thread. –
@JonathanLeffler Les variables statiques sont-elles partagées entre les threads? –