我试图了解glibcerrno
如何在没有预处理器替换errno
符号的情况下进行初始化。
我首先尝试基于csu/errno-loc.c和csu/errno.c自己实现一个简单的版本:
迈尔诺
#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;
}
但是,当我尝试编译时,我收到以下错误消息:
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
我可以说预处理器在第 3 行(*myerrno_location(void))
遇到时正在替换myerrno
——这自然是预期的行为。
我不明白为什么这对glibc来说不是问题。如何在不重命名静态变量errno
的情况下解决这个预处理器替换问题的线程安全实现?errno