On Mon, Jun 23, 2008 at 01:45:28PM +0200, Michael Kerrisk wrote:
> On Mon, Jun 23, 2008 at 1:43 PM, Stephane Chazelas
> <[EMAIL PROTECTED]> wrote:
> > On Mon, Jun 23, 2008 at 01:34:04PM +0200, Michael Kerrisk wrote:
> >> On Mon, Jun 23, 2008 at 1:31 PM, Stephane Chazelas
> >> <[EMAIL PROTECTED]> wrote:
> >> > On Mon, Jun 23, 2008 at 12:37:50PM +0200, Michael Kerrisk wrote:
> >> > [...]
> >> >>        This  feature  is not available if the program is compiled with
> >> >>        cc -std=cc99 or cc -D_ISOC99_SOURCE (unless _GNU_SOURCE is also
> >> > [...]
> >> >
> >> > typo: -std=c99, not cc99.
> >>
> >> Thanks.  Fixed.  It sort of balanced out.  Elsewhere in the page I
> >> wrote another typo: -std=99.
> > [...]
> >
> > With tcc, you need the -D_GNU_SOURCE:
> 
> Thanks.  I don't think I'll worry about documenting that though.

Hmmm, in stdio.h, we have:

#if defined __USE_ISOC99 && !defined __USE_GNU \
    && (!defined __LDBL_COMPAT || !defined __REDIRECT) \
    && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K)
# ifdef __REDIRECT
/* 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 (sscanf, (__const char *__restrict __s,
                                __const char *__restrict __format, ...),
                       __isoc99_sscanf) __THROW;


Which looks a bit bogus to me (see the handling of __REDIRECT
for instance).

__STRICT_ANSI__ is selected by -std=c99 and -ansi.
__USE_XOPEN2K (XPG6) is selected when __POSIX_C_SOURCE >= 200112L
which is selected by:

/* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2
   (and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined).  */
#if ((!defined __STRICT_ANSI__ || (_XOPEN_SOURCE - 0) >= 500) && \
     !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE)
# define _POSIX_SOURCE  1
# if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 500
#  define _POSIX_C_SOURCE       2
# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 600
#  define _POSIX_C_SOURCE       199506L
# else
#  define _POSIX_C_SOURCE       200112L
# endif
#endif


So, %as is not available for instance with:

cc -D__STDC_VERSION__=199901L
(tcc does set that as a builtin macro
http://hg.sharesource.org/mercurialtcc/rev/1e81d5b65878)

And it is availabe for instance with

cc -D_ISOC99_SOURCE -D_XOPEN_SOURCE=500

Without any implicit define, %as will be enabled I think.

-- 
Stéphane



--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to