我正在研究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形式有什么区别?任何我可以看到他们的来源的链接将受到高度赞赏.
解决方法
原因是严格遵循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,__isoc99_sscanf);