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 errnokhô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, errnolà 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