2013-05-04 18 views
7

Ich studierte verschiedene Compiler-Option in GCC und beobachtete Änderungen, wenn ich Änderungen in den Standard zu verwenden.__isoc99_scanf und scanf

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

Ich sehe einer der Opcodes als

call __isoc99_scanf 

und jetzt, wenn ich kompilieren mit den C89-Standards

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

Ich sehe den Opcode als

call scanf 

Was ist der Unterschied zwischen diesen beiden fo RMS von scanf? Jeder Link, wo ich ihre Quelle sehen kann, würde sehr geschätzt werden.

+0

dank @Mat, ich brauche wirklich diejenigen Ist auf Kapital zu arbeiten .. :) – ArunMKumar

Antwort

8

Der Grund ist streng Nachfolge c99 nicht zulassen einige bestehende GNU-Erweiterung Konvertierungsspezifizierer.

In glibc 2.17, in libio/stdio.h gibt es diesen Kommentar:

/* 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 erwähnt mehrere Typänderungs Zeichen in c99 eingeführt:

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

so folgern ich es mehr über die Kompatibilität? – ArunMKumar