2013-05-04 41 views
7

Tôi đã nghiên cứu các tùy chọn trình biên dịch khác nhau trong GCC và quan sát những thay đổi khi tôi thực hiện các thay đổi trong tiêu chuẩn sẽ được sử dụng.__isoc99_scanf and scanf

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

tôi thấy một trong những opcodes như

call __isoc99_scanf 

và bây giờ khi tôi biên dịch với các tiêu chuẩn C89

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

tôi thấy opcode như

call scanf 

gì là sự khác biệt giữa hai thứ này rms của scanf? Bất kỳ liên kết nào mà tôi có thể thấy nguồn của họ sẽ được đánh giá cao.

+0

nhờ @Mat, tôi thực sự cần phải làm việc trên tận những Is .. :) – ArunMKumar

Trả lời

8

Lý do là sau khắt khe của c99 không cho phép một số specifiers chuyển đổi phần mở rộng GNU hiện có.

Trong glibc 2.17, trong libio/stdio.h có nhận xét này:

/* 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); 
6

scanf(3) manual đề cập đến một vài loại bổ nhân vật được giới thiệu vào 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 
+0

vì vậy tôi suy ra nó là nhiều về tính tương thích? – ArunMKumar