Trong errno.h, biến này được khai báo là extern int errno;
Đây là những gì tiêu chuẩn C nói:
Macro errno
không cần phải là định danh của một đối tượng. Nó có thể mở rộng thành một giá trị có thể sửa đổi do một lệnh gọi hàm (ví dụ *errno()
:).
Nói chung, errno
là một macro gọi một hàm trả về địa chỉ của số lỗi cho luồng hiện tại, sau đó hủy bỏ nó.
Đây là những gì tôi có trên Linux, trong /usr/include/bits/errno.h:
/* 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
Cuối cùng, nó tạo ra loại mã này:
> cat essai.c
#include <errno.h>
int
main(void)
{
errno = 0;
return 0;
}
> gcc -c -Wall -Wextra -pedantic essai.c
> objdump -d -M intel essai.o
essai.o: file format elf32-i386
Disassembly of section .text:
00000000 <main>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 e4 f0 and esp,0xfffffff0
6: e8 fc ff ff ff call 7 <main+0x7> ; get address of errno in EAX
b: c7 00 00 00 00 00 mov DWORD PTR [eax],0x0 ; store 0 in errno
11: b8 00 00 00 00 mov eax,0x0
16: 89 ec mov esp,ebp
18: 5d pop ebp
19: c3 ret