我在这里检查了errno.h的源代码:
http://unix.superglobalmegacorp.com/Net2/newsrc/sys/errno.h.html
它显示errno被声明为extern,当我们使用errno时,我们可以直接给它赋值。这意味着errno在其他地方被定义和分配,确切地说是在哪里定义的呢?
int errno;
。头文件中的 extern int errno;
只是意味着 "这个变量存在,你会在其他地方找到它" - 也许就在实际调用你的 main
函数的代码旁边,或者类似的地方。errno
并不严格是一个变量。# ifndef __ASSEMBLER__
/* Function to get address of global `errno' variable. */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ())
# endif
# endif /* !__ASSEMBLER__ */
#endif /* _ERRNO_H */
准确地说,__errno_location
的实现取决于哪个操作系统的哪个版本,但基本上是这样的:
__thread int errno;
在C ++11中,__thread
是用来支持线程本地存储说明符thread_local
的,它由操作系统作为某种“每个线程交换数据”的类型存储方式进行支持。确切的实现方式取决于操作系统。在x86和x86-64中,fs
和gs
分别用于“每个CPU”和“每个线程”的存储(但它们是“相对”),我现在无法确定哪一个是哪一个。
printf
被声明为外部函数,我们可以调用它,那么它在哪里定义呢? - user253751