12

我正在研究 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?任何我可以看到其来源的链接都将受到高度赞赏。

4

2 回答 2

10

原因是严格遵循 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);
于 2013-05-04T16:27:07.497 回答
6

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
于 2013-05-04T15:43:58.037 回答