ग़लती में। इस चर को एक्सटर्नल इंट इरनो के रूप में घोषित किया गया है;
यहाँ सी मानक कहते हैं:
मैक्रो errno
किसी ऑब्जेक्ट का पहचानकर्ता नहीं होना चाहिए। यह एक फ़ंक्शन कॉल (उदाहरण के लिए *errno()
) से उत्पन्न एक परिवर्तनीय अंतराल तक फैल सकता है ।
आम तौर पर, errno
एक मैक्रो होता है जो एक फ़ंक्शन को वर्तमान थ्रेड के लिए त्रुटि संख्या के पते को वापस करता है, फिर इसे संदर्भित करता है।
यहाँ मेरे पास लिनक्स पर, /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
अंत में, यह इस तरह का कोड उत्पन्न करता है:
> 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