Article View: fr.comp.lang.c
Article #19Re: flux standard declares en lvalue !
From: Antoine Leca
Date: Wed, 05 Apr 2000 00:00
Date: Wed, 05 Apr 2000 00:00
101 lines
4623 bytes
4623 bytes
Laurent Deniau �crivit :
>
> Horst Kraemer wrote:
> >
> > On Tue, 04 Apr 2000 17:51:29 +0200, Laurent Deniau
> > <Laurent.Deniau@cern.ch> wrote:
> >
> > > Je ne sais si c'est un bug mais la version de gcc **egcs-2.91.66
> > > 19990314/Linux (egcs-1.1.2 release)** sur architecture linux 2.2 (sur la
> > > 2.0 tout est ok) declare les flux standards stdin, stdout et stderr comme
> > > variables externes (/usr/include/stdio.h):
> > > En consequence ces flux ne sont plus constants et peuvent etre modifies.
> > > D'autre part, on ne peut plus faire (ce qui me gene le plus):
> >
> > > FILE *file_err = stderr;
> >
> > Tu parles d'une initialisitation sur "niveau fichier". Eh bien, m�me
> > la norme c89 n'a jamais donn�e de garantie que cela soit possible.
> > Elle dit que stdin, stderr et stout sont des "expressions" du type
> > FILE*. Elle ne dit pas qu'il doit s'agir d'expressions constantes.
Et elle ajoute dans une note de base de page (non normative), � propos
de la fonction freopen() :
116The primary use of the freopen function is to change the
file associated with a standard text stream (stderr,
stdin, or stdout), as those identifiers need not be
modifiable lvalues to which the value returned by the
fopen function may be assigned.
�videment, il est �crit que � les flux standard ne sont pas n�ces-
sairement des valeurs-g modifiables �. Mais il n'est pas �crit qu'ils
n'ont pas le droit de l'�tre, et une telle interpr�tation serait
tendancieuse.
> Pour ne citer qu'elle:
Qui (ou quoi) cites-tu ?
Je ne trouve pas ce texte dans ma documentation.
> The expressions stdin, stdout, and stderr have type FILE *,
Oui.
Note bien ce qu'il est �crit : les � expressions �...
> and their values are established prior to the start of an application
> program to certain standard text streams.
Non. La norme dit plut�t :
[#7] At program startup, three text streams are predefined
^^
and need not be opened explicitly -- standard input (for
reading conventional input), standard output (for writing
conventional output), and standard error [...]
pr�c�d� de :
[ les macros stdxxx ]
which are expressions of type ``pointer to FILE'' that point
to the FILE objects associated, respectively, with the
standard error, input, and output streams.
Donc il est clair que tu ne peux pas utiliser la valeur de ces macros
avant "program startup", et en cons�quence pas dans une initialisation
globale.
> [...]
> These expressions (parlant de stdxx) are not usually lvalues, and in any
> case they should not be altered by assignment. The freopen function may be
> used to change them.
Oui. Et alors ?
> [...]
> The expressions stdin, stdout and stderr are often defined as addresses of
> static or global stream descriptors:
>
> extern FILE iob[FOPEN_MAX];
> ...
> #define stdin (&iob[0])
> #define stdout (&iob[1])
> #define stderr (&iob[2])
Ce bout de code est explicitement en violation de la norme (iob est un
nom r�serv� � l'utilisateur).
M�me en rajoutant deux soulign�s ou _IO_ devant iob, il y a �crit
"often", ce qui �claire que le fait que ce n'est pas une convention
unanime, surtout quand il est �crit juste au-dessus "are not usually
lvalues" (et jusqu'� preuve du contraire, (&iob[0]) est une valeur-g)
> Et jusqu'a il y a peu, c'etait bien ce qu'il y avait dans
> /usr/include/stdio.h et ca me convenait tres bien...
>
> Qui croire ?
La norme.
Antoine
Technical Details
Message-ID:
<38EB269F.7F1D91FF@renault.fr>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<38EA0F81.14175F08@cern.ch> <38ea3e7a.178990280@news.btx.dtag.de> <38EB0E65.C5CDC4AA@cern.ch>Show Full Headers
Complete Article Headers
X-Google-Language: FRENCH,ASCII X-Google-Thread: 108d68,cf0ca10e654ef794 X-Google-Attributes: gid108d68,public X-Google-Thread: f9822,cf0ca10e654ef794 X-Google-Attributes: gidf9822,public From: Antoine Leca <Antoine.Leca@renault.fr> Subject: Re: flux standard declares en lvalue ! Date: 2000/04/05 Message-ID: <38EB269F.7F1D91FF@renault.fr> X-Deja-AN: 607021484 Distribution: world Content-Transfer-Encoding: 8bit References: <38EA0F81.14175F08@cern.ch> <38ea3e7a.178990280@news.btx.dtag.de> <38EB0E65.C5CDC4AA@cern.ch> X-Accept-Language: ca,fr Content-Type: text/plain; charset=iso-8859-1 X-Complaints-To: abuse@renault.fr X-Trace: ons.mc2.renault.fr 954934945 28328 172.26.137.60 (5 Apr 2000 11:42:25 GMT) Organization: RENAULT (mais cette contribution est personnelle et n'engage pas RENAULT) Mime-Version: 1.0 NNTP-Posting-Date: 5 Apr 2000 11:42:25 GMT Newsgroups: fr.comp.lang.c,cern.linux