12

GCC のさまざまなコンパイラ オプションを調べたり、使用する標準を変更したときに変更を観察したりしていました。

$ gcc Q1.c -Wall -save-temps -o Q1
$ vi Q1.s

オペコードの1つが次のように表示されます

 call    __isoc99_scanf

そして今、C89標準でコンパイルすると

$gcc Q1.c -Wall -save-temps -std=c89 -o Q1
$ vi Q1.s

オペコードは次のように表示されます

call    scanf

のこれら 2 つの形式の違いは何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 に答える