首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >__isoc99_scanf和scanf

__isoc99_scanf和scanf
EN

Stack Overflow用户
提问于 2013-05-04 22:23:06
回答 2查看 17K关注 0票数 12

我正在研究GCC中的各种编译器选项,并观察当我对要使用的标准进行更改时发生的变化。

代码语言:javascript
运行
复制
$ gcc Q1.c -Wall -save-temps -o Q1
$ vi Q1.s

我看到其中一个操作码是

代码语言:javascript
运行
复制
 call    __isoc99_scanf

现在,当我使用C89标准进行编译时

代码语言:javascript
运行
复制
$gcc Q1.c -Wall -save-temps -std=c89 -o Q1
$ vi Q1.s

我认为操作码是

代码语言:javascript
运行
复制
call    scanf

这两种形式的scanf有什么不同?任何链接,我可以看到他们的来源,将非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-05 00:27:07

原因是严格遵循c99不允许一些现有的GNU扩展转换说明符。

在glibc 2.17中,在libio/stdio.h中有这样的注释:

代码语言:javascript
运行
复制
/* 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);
票数 10
EN

Stack Overflow用户

发布于 2013-05-04 23:43:58

scanf(3) manual提到了c99中引入的几个类型修饰符:

代码语言:javascript
运行
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16376341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档