__isoc99_scanf and scanf

南笙酒味 提交于 2019-12-22 04:01:29

问题


I was studying various compiler option in GCC and observing changes when I made changes in the standard to be used.

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

I see one of the opcodes as

 call    __isoc99_scanf

and now when I compile with the C89 standards

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

I see the opcode as

call    scanf

What is the difference between these two forms of scanf? Any link where I can see their source would be highly appreciated.


回答1:


The reason is strict following of c99 disallow some existing GNU extension conversion specifiers.

In glibc 2.17, in libio/stdio.h there is this comment:

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



回答2:


scanf(3) manual mentions several type modifiers characters introduced in 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


来源:https://stackoverflow.com/questions/16376341/isoc99-scanf-and-scanf

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!