isoc99 scanf и scanf

Я изучал различные опции компилятора в GCC и наблюдал за изменениями, когда я вносил изменения в используемый стандарт.

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

Я вижу один из опкодов как

 call    __isoc99_scanf

и теперь, когда я компилирую со стандартами C89

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

Я вижу код как

call    scanf

в чем разница между этими двумя формами scanf? Любая ссылка, где я могу видеть их источник, будет высоко оценена.

2 ответов


причина заключается в строгом следовании c99 запретить некоторые существующие спецификаторы преобразования расширения GNU.

в glibc 2.17, в libio/stdio.h есть такой комментарий:

/* 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);

руководство scanf(3) упоминает несколько символов модификаторов типов, введенных в 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