微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

__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形式有什么区别?任何我可以看到他们的来源的链接将受到高度赞赏.

解决方法

原因是严格遵循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);

原文地址:https://www.jb51.cc/c/119497.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐