Thread View: fr.comp.lang.c
9 messages
9 total messages
Started by Laurent Deniau
Tue, 04 Apr 2000 00:00
flux standard declares en lvalue !
Author: Laurent Deniau
Date: Tue, 04 Apr 2000 00:00
Date: Tue, 04 Apr 2000 00:00
29 lines
1887 bytes
1887 bytes
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): /* Standard streams. */ extern FILE *stdin; /* Standard input stream. */ extern FILE *stdout; /* Standard output stream. */ extern FILE *stderr; /* Standard error output stream. */ 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; Est ce que quelqu'un peut m'expliquer ce changement par rapport a la norme ISO C90 et a defaut me dire comment initialiser avant le lancement du programme la variable statique file_err locale a une fonction qui est dans une bibliotheque dynamique. Merci. a+, ld. -- [ Laurent Deniau -- Data Analysis and Signal Processing ] [ CERN -- The European Laboratory for Particle Physics ] [ Laurent.Deniau@cern.ch - http://home.cern.ch/~ldeniau ] [ -- One becomes old when dreams become regrets -- ]
Re: flux standard declares en lvalue !
Author: Eric Levenez
Date: Tue, 04 Apr 2000 00:00
Date: Tue, 04 Apr 2000 00:00
43 lines
2558 bytes
2558 bytes
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): > > /* Standard streams. */ > extern FILE *stdin; /* Standard input stream. */ > extern FILE *stdout; /* Standard output stream. */ > extern FILE *stderr; /* Standard error output stream. */ C'est la m�me chose sur Lynx OS depuis plus de 4 ans :-) Donc ce n'est pas un bug, mais une nouvelle caract�ristique. > 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; > > Est ce que quelqu'un peut m'expliquer ce changement par rapport a la norme > ISO C90 et a defaut me dire comment initialiser avant le lancement du > programme la variable statique file_err locale a une fonction qui est dans > une bibliotheque dynamique. Je pense que le seul moyen est de mettre le code : file_err = stderr; dans une routine d'init. S'il n'y en a pas, alors il faut ruser et faire un truc du genre : FILE *file_err = NULL; /* D�claration globale */ et en t�te de chaque routine : if (!file_err) file_err = stderr; Ce n'est pas joli, mais cela devrait faire la farce. -- �ric L�v�nez <http://perso.wanadoo.fr/levenez> Unix is not only an OS, it's a way of life.
Re: flux standard declares en lvalue !
Author: Horst Kraemer
Date: Tue, 04 Apr 2000 00:00
Date: Tue, 04 Apr 2000 00:00
30 lines
1897 bytes
1897 bytes
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): > /* Standard streams. */ > extern FILE *stdin; /* Standard input stream. */ > extern FILE *stdout; /* Standard output stream. */ > extern FILE *stderr; /* Standard error output stream. */ Pourquoi pas ? > 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. Donc un LValue modifiable a toujours �t� legal pour stdin, stout et stderr. -- Horst
Re: flux standard declares en lvalue !
Author: Antoine Leca
Date: Wed, 05 Apr 2000 00:00
Date: Wed, 05 Apr 2000 00:00
47 lines
2303 bytes
2303 bytes
Laurent Deniau �crivit : > > Je ne sais si c'est un bug Ce n'en est pas un. > mais la version de gcc declare les flux standards stdin, stdout et > stderr comme variables externes (/usr/include/stdio.h): > > /* Standard streams. */ > extern FILE *stdin; /* Standard input stream. */ <snip> > En consequence ces flux ne sont plus constants et peuvent etre modifies. [ les pointeurs vers les "flux" ] Oui. Et c'est parfaitement autoris� par la norme. > D'autre part, on ne peut plus faire (ce qui me gene le plus): > > FILE *file_err = stderr; [ au niveau global ] Cela n'a jamais �t� explicitement autoris�. C'�tait une erreur des versions pr�c�dentes de ton compilateur+biblioth�que que de l'autoriser. > Est ce que quelqu'un peut m'expliquer ce changement par rapport a la norme > ISO C90 Il n'y a aucun changement *par rapport � la norme*. Il y a au contraire rapprochement de la norme ISO C90. > et a defaut me dire comment initialiser avant le lancement du > programme la variable statique file_err locale a une fonction > qui est dans une bibliotheque dynamique. Si tu relis la question, tu verras que la r�ponse est : c'est impossible en C (o� les variables statiques sont initialis�es au moment de l'�dition de liens, donc avant l'ex�cution de la moindre fonction). cf. les solutions d'�ric pour contourner le probl�me. Antoine
Re: flux standard declares en lvalue !
Author: Laurent Deniau
Date: Wed, 05 Apr 2000 00:00
Date: Wed, 05 Apr 2000 00:00
64 lines
3024 bytes
3024 bytes
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): > > > /* Standard streams. */ > > extern FILE *stdin; /* Standard input stream. */ > > extern FILE *stdout; /* Standard output stream. */ > > extern FILE *stderr; /* Standard error output stream. */ > > Pourquoi pas ? > > > 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. > Donc un LValue modifiable a toujours �t� legal pour stdin, stout et > stderr. Pour ne citer qu'elle: The expressions stdin, stdout, and stderr have type FILE *, and their values are established prior to the start of an application program to certain standard text streams. [...] 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. [...] 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]) 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 ? > -- > Horst a+, ld. -- [ Laurent Deniau -- Data Analysis and Signal Processing ] [ CERN -- The European Laboratory for Particle Physics ] [ Laurent.Deniau@cern.ch - http://home.cern.ch/~ldeniau ] [ -- One becomes old when dreams become regrets -- ]
Re: flux standard declares en lvalue !
Author: Hans-Bernhard Broeker
Date: Wed, 05 Apr 2000 00:00
Date: Wed, 05 Apr 2000 00:00
17 lines
1288 bytes
1288 bytes
[Pardon my forgotten French ... I'll write in English...] Antoine Leca (Antoine.Leca@renault.fr) wrote: [...] : > FILE *file_err = stderr; : [ au niveau global ] : Cela n'a jamais �t� explicitement autoris�. C'�tait une erreur des versions : pr�c�dentes de ton compilateur+biblioth�que que de l'autoriser. It most definitely is *not* error to allow something in addition to what the standard documents says you must allow. The *code* is incorrect, not the compiler that accepted it. The standard does not guarantee that stdin is a constant expression, but neither does it forbid it being one. Nor is a diagnostic required, in this case, AFAICS.
Re: flux standard declares en lvalue !
Author: 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
Re: flux standard declares en lvalue !
Author: Antoine Leca
Date: Thu, 06 Apr 2000 00:00
Date: Thu, 06 Apr 2000 00:00
39 lines
2461 bytes
2461 bytes
Hans-Bernhard Broeker wrote:
>
> [Pardon my forgotten French ... I'll write in English...]
>
> Antoine Leca (Antoine.Leca@renault.fr) wrote:
> [...]
> : > FILE *file_err = stderr;
>
> : [ au niveau global ]
>
> : Cela n'a jamais �t� explicitement autoris�. C'�tait une erreur des versions
> : pr�c�dentes de ton compilateur+biblioth�que que de l'autoriser.
>
> It most definitely is *not* error to allow something in addition to
> what the standard documents says you must allow. The *code* is
> incorrect, not the compiler that accepted it. The standard does not
> guarantee that stdin is a constant expression, but neither does it
> forbid it being one. Nor is a diagnostic required, in this case,
> AFAICS.
<traduction>
Ce n'est certainement *pas* une erreur d'autoriser quelque chose
en plus de ce que la norme autorise. Le *code* est incorrect, mais
le compilateur qui l'accepte ne l'est pas. La norme ne garantit pas
que stdin soit une expression constante, mais elle n'interdit pas
non plus qu'elle le soit. Pas plus que [la norme] ne requiert de
diagnostic, pour autant que je puisse [S=?].
</traduction>
Tu as raison, mes paroles �taient trop tranch�es.
En fait, je voulais dire que c'�tait maladroit ("mistake" instead of
"error") que d'autoriser cela auparavant. Mais apr�s r�flexion je pense
effectivement que c'est difficile d'�mettre un avertissement dans ce
cas, sauf � utiliser un outil genre lint et accepter d'�tre noy� sous
les messages.
Antoine
Re: flux standard declares en lvalue !
Author: -hs-
Date: Thu, 06 Apr 2000 00:00
Date: Thu, 06 Apr 2000 00:00
12 lines
1275 bytes
1275 bytes
Antoine Leca a �crit dans le message <38EC4544.26AA50FE@renault.fr>... >> AFAICS. >diagnostic, pour autant que je puisse [S=?]. As far as I can say... -- -hs- "Stove" CLC-FAQ: http://www.eskimo.com/~scs/C-faq/top.html ISO-C Library: http://www.dinkum.com/htm_cl "It's specified. But anyone who writes code like that should be transmogrified into earthworms and fed to ducks." -- Chris Dollin CLC
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads