2013-05-04 14 views
7

Badałem różne opcje kompilatora w GCC i obserwowałem zmiany, gdy wprowadzałem zmiany w standardzie, który ma być użyty.__isoc99_scanf i scanf

$ gcc Q1.c -Wall -save-temps -o Q1 
$ vi Q1.s 

widzę jeden z opcodes jak

call __isoc99_scanf 

a teraz kiedy mogę skompilować ze standardami C89

$gcc Q1.c -Wall -save-temps -std=c89 -o Q1 
$ vi Q1.s 

widzę opcode jako

call scanf 

Co jest różnica między tymi dwoma fo rms z scanf? Każdy link, w którym mogę zobaczyć ich źródło, byłby bardzo ceniony.

+0

dzięki @Mat, naprawdę trzeba pracować na czerpanie nich jest .. :) – ArunMKumar

Odpowiedz

8

Powodem jest ścisłe naśladowanie C99 niepozwalające niektóre istniejące specyfikacje dotyczące rozszerzenia GNU konwersji.

w glibc 2.17, w libio/stdio.h jest ten komentarz:

/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[ 
    GNU extension which conflicts with valid %a followed by letter 
    s, S or [. */ 
extern int __REDIRECT (fscanf, (FILE *__restrict __stream, 
    const char *__restrict __format, ...), 
    __isoc99_fscanf) __wur; 
extern int __REDIRECT (scanf, (const char *__restrict __format, ...), 
    __isoc99_scanf) __wur; 
extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s, 
     const char *__restrict __format, ...), 
     __isoc99_sscanf); 
6

scanf(3) manual wymienia kilka modyfikatorów typu znaki wprowadzone w C99:

j  As for h, but the next pointer is a pointer to an intmax_t or a uintmax_t. This modifier was introduced in C99 
t  As for h, but the next pointer is a pointer to a ptrdiff_t. This modifier was introduced in C99. 
z  As for h, but the next pointer is a pointer to a size_t. This modifier was introduced in C99. 
a  (C99) Equivalent to f 
+0

więc wywnioskować, że jest więcej o zgodności? – ArunMKumar