🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.c
Article #19

Re: flux standard declares en lvalue !

#19
From: Antoine Leca
Date: Wed, 05 Apr 2000 00:00
101 lines
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-mail
References: <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