c - __isoc99_scanf 和 scanf

标签 c iso

我正在研究 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,
      const char *__restrict __format, ...),
      __isoc99_sscanf);

关于c - __isoc99_scanf 和 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16376341/

相关文章:

c - 每个 .h 文件都需要一个在另一个文件中定义的结构? (C)

c - 卡在逻辑门 C 程序上。 (C 新手)

c - 如何在 Linux 中使用 GCC 编译一个简单的源文件

c - 如何编译c代码?

android - 如何在图像读取器camera2中传递捕获信息

c - 警告 : assignment makes integer from pointer without a cast

internationalization - 我应该使用 ISO 3166 国家代码 (US) 还是文化代码 (en-US)?

c++ - 将 ISO 8859-X 转换为 UNICODE 的方法

iphone - iOS 应用程序因语言环境更改而崩溃

c++ - 是否对 C++ 的实现进行监督?