 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Aurélien REGAT-BARREL Guest
|
Posted: Wed Nov 24, 2004 2:20 pm Post subject: Initialisation de variable (!) |
|
|
Hello à tous,
Je ne comprends pas pourquoi dans l'exemple suivant b3 est considéré comme
la déclaration d'un prototype de fonction (VC++ 7.1, MingW 3.3.1), d'autant
plus que b2 est valide.
class A
{
public:
A( int ) {}
};
class B
{
public:
B( A a1, A a2 ) {};
};
int main()
{
int i1 = 0;
int i2 = 0;
A a1( 0 );
A a2( 0 );
B b1( a1, a2 );
B b2( A( 0 ), A( 0 ) );
// warning C4930 : 'B b3(A,A)' : fonction prototypée non appelée
// (était-ce la définition de variable souhaitée ?)
B b3( A( i1 ), A( i2 ) );
}
La suite du programme montre bien que b3 est considéré comme une fonction.
Merci.
--
Aurélien REGAT-BARREL
|
|
| Back to top |
|
 |
Julien Lamy Guest
|
Posted: Wed Nov 24, 2004 2:33 pm Post subject: Re: Initialisation de variable (!) |
|
|
Aurélien REGAT-BARREL wrote:
| Quote: | Hello à tous,
Je ne comprends pas pourquoi dans l'exemple suivant b3 est considéré comme
la déclaration d'un prototype de fonction (VC++ 7.1, MingW 3.3.1), d'autant
plus que b2 est valide.
|
[...]
| Quote: | La suite du programme montre bien que b3 est considéré comme une fonction.
Merci.
|
Bug des compilateurs ? g++ 3.3.4 et 3.4.2 compilent sans problème.
--
Julien Lamy
|
|
| Back to top |
|
 |
Arnaud Meurgues Guest
|
Posted: Wed Nov 24, 2004 2:38 pm Post subject: Re: Initialisation de variable (!) |
|
|
Aurélien REGAT-BARREL wrote:
| Quote: | Je ne comprends pas pourquoi dans l'exemple suivant b3 est considéré comme
la déclaration d'un prototype de fonction (VC++ 7.1, MingW 3.3.1), d'autant
plus que b2 est valide.
|
1 > B b2( A( 0 ), A( 0 ) );
| Quote: | // warning C4930 : 'B b3(A,A)' : fonction prototypée non appelée
// (était-ce la définition de variable souhaitée ?)
2 > B b3( A( i1 ), A( i2 ) ); |
C'est un problème classique du C++.
En fait, le compilateur lit la ligne 2 ainsi :
B b3(A (i1), A (i2));
C'est-à-dire qu'il voit le prototype d'une fonction b3 renvoyant B et
prenant deux arguments, i1 et i2, tous deux de type A.
La ligne 1 ne génère pas la même ambiguïté, puisque 0 ne peut pas être
pris pour un nom de variable.
Le contournement est de parenthéser chaque argument :
B b3((A(i1)), (A(i2)));
La grammaire ne permettant pas que des arguments de fonctions soient
décrit entre parenthèses, celà lève l'ambiguïté.
--
Arnaud
(Supprimez les geneurs pour me répondre)
|
|
| Back to top |
|
 |
Aurélien REGAT-BARREL Guest
|
Posted: Wed Nov 24, 2004 2:49 pm Post subject: Re: Initialisation de variable (!) |
|
|
| Quote: | Bug des compilateurs ? g++ 3.3.4 et 3.4.2 compilent sans problème.
Seul VC++ me met l'avertissement. |
Ajoute un test
if ( b1 == b3 );
et recompile...
--
Aurélien REGAT-BARREL
|
|
| Back to top |
|
 |
Aurélien REGAT-BARREL Guest
|
Posted: Wed Nov 24, 2004 2:53 pm Post subject: Re: Initialisation de variable (!) |
|
|
| Quote: | C'est un problème classique du C++.
En fait, le compilateur lit la ligne 2 ainsi :
B b3(A (i1), A (i2));
C'est-à-dire qu'il voit le prototype d'une fonction b3 renvoyant B et
prenant deux arguments, i1 et i2, tous deux de type A.
La ligne 1 ne génère pas la même ambiguïté, puisque 0 ne peut pas être
pris pour un nom de variable.
Le contournement est de parenthéser chaque argument :
B b3((A(i1)), (A(i2)));
La grammaire ne permettant pas que des arguments de fonctions soient
décrit entre parenthèses, celà lève l'ambiguïté.
|
Ah... Effectivement ça corrige. Pfff, 2 heures là dessus.
Merci.
--
Aurélien REGAT-BARREL
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Nov 24, 2004 6:16 pm Post subject: Re: Initialisation de variable (!) |
|
|
On Wed, 24 Nov 2004 15:38:49 +0100, Arnaud Meurgues
<arnaud (AT) meurgues (DOT) non.fr.invalid>:
| Quote: | C'est-à-dire qu'il voit le prototype d'une fonction b3 renvoyant B et
prenant deux arguments, i1 et i2, tous deux de type A.
|
Plus exactement, il y a deux interprétations possibles : une
déclaration de fonction et une déclaration de variable. Et dans pareil
cas, l'interprétation "déclaration de fonction" est toujours
privilégiée.
--
;-)
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Nov 25, 2004 8:16 am Post subject: Re: Initialisation de variable (!) |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote
| Quote: | On Wed, 24 Nov 2004 15:38:49 +0100, Arnaud Meurgues
[email]arnaud (AT) meurgues (DOT) non.fr.inva[/email]lid>:
C'est-à-dire qu'il voit le prototype d'une fonction b3 renvoyant B et
prenant deux arguments, i1 et i2, tous deux de type A.
Plus exactement, il y a deux interprétations possibles : une
déclaration de fonction et une déclaration de variable. Et dans pareil
cas, l'interprétation "déclaration de fonction" est toujours
privilégiée.
|
Non. L'abiguïté se situe plus bas, avec la suite de tokens « A(i1) ».
C'est là où il y a deux interprétations possibles : c'est une expression
(une « Explicit type conversion (functional notation) », §5.2.3), ou
c'est la déclaration d'une variable. Les deux sont légale dans ce
contexte, et la règle, c'est qu'en cas d'ambiguïté, on privilège la
déclaration plutôt que l'expression.
Évidemment, une fois qu'on a décidé qu'il s'agit des declarations, il
n'y a plus d'ambiguïté entre une declaration de fonction ou une
declaration d'une variable.
Note que selon la norme, il suffit qu'il y a un seul « paramètre » qui
ne peut pas être une declaration pour que l'interprêtation fonction ne
soit pas possible, et que donc, on se trouve dans un contexte où une
declaration ne serait pas légale pour les autres paramètres. Ce qui
n'est pas ce qu'il y a de plus simple pour un compilateur, et certains
ont eu (et peut-être ont encore) des problèmes avec ça. Du coup, il est
préférable de désambiguër tous les paramètres.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Thu Nov 25, 2004 8:23 pm Post subject: Re: Initialisation de variable (!) |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
| Quote: | Note que selon la norme, il suffit qu'il y a un seul « paramètre » qui
ne peut pas être une declaration pour que l'interprêtation fonction ne
soit pas possible, et que donc, on se trouve dans un contexte où une
declaration ne serait pas légale pour les autres paramètres. Ce qui
n'est pas ce qu'il y a de plus simple pour un compilateur, et certains
ont eu (et peut-être ont encore) des problèmes avec ça. Du coup, il est
préférable de désambiguër tous les paramètres.
|
Cela doit être simple, parce que certains proposent d'ajouter des
« contextual keywords » -- certains langages récents avec la syntaxe
de C++ l'ont fait.
:-(
-- Gaby
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Nov 25, 2004 9:59 pm Post subject: Re: Initialisation de variable (!) |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | Cela doit être simple, parce que certains proposent d'ajouter des
« contextual keywords » -- certains langages récents avec la syntaxe
de C++ l'ont fait.
|
Tu penses à des propositions particulières ? Lesquelles ? Et à
quelles constructions penses-tu dans d'autres langages ? Par simple
curiosité.
--drkm
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Nov 25, 2004 11:10 pm Post subject: Re: Initialisation de variable (!) |
|
|
drkm wrote:
| Quote: | Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
Cela doit être simple, parce que certains proposent d'ajouter des
« contextual keywords » -- certains langages récents avec la syntaxe
de C++ l'ont fait.
Tu penses à des propositions particulières ? Lesquelles ?
|
Le sujet apparaît dans
http://www2.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1703.pdf
Par contre, je crois que l'argument a plus été utilisé dans des
discussion autour de papiers (comment ne pas ajouter de mots clefs pour
faire X ou Y) que dans des proposition en tant que telles.
| Quote: | Et à
quelles constructions penses-tu dans d'autres langages ? Par simple
curiosité.
|
Extrait du MSDN :
| Quote: | A contextual keyword is used to provide a specific meaning in the code, but it is not a reserved word in C#. The following contextual keywords are introduced in this section:
partial Defines partial classes, structs, and interfaces throughout the same compilation unit.
where Adds constraints to a generic declaration.
yield Used in an iterator block to return a value to the enumerator object or to signal the end of iteration.
value Used to set accessors and to add or remove event handlers.
|
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Nov 25, 2004 11:42 pm Post subject: Re: Initialisation de variable (!) |
|
|
On Fri, 26 Nov 2004 00:10:12 +0100, Loïc Joly
<loic.actarus.joly (AT) wanadoo (DOT) fr>:
| Quote: | Extrait du MSDN :
A contextual keyword is used to provide a specific
meaning in the code, but it is not a reserved word in C#.
|
Euh... déjà ça, je le sens mal. Si je comprends bien, "yield", par
exemple, peut avoir un sens précis pour le compilo à certains
endroits, et être un simple identifiant à d'autres ? °_°
--
;-)
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Fri Nov 26, 2004 2:35 am Post subject: Re: Initialisation de variable (!) |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | On Fri, 26 Nov 2004 00:10:12 +0100, Loïc Joly
[email]loic.actarus.joly (AT) wanadoo (DOT) fr[/email]>:
Extrait du MSDN :
A contextual keyword is used to provide a specific
meaning in the code, but it is not a reserved word in C#.
Euh... déjà ça, je le sens mal. Si je comprends bien, "yield", par
exemple, peut avoir un sens précis pour le compilo à certains
endroits, et être un simple identifiant à d'autres ? °_°
|
Oui.
http://blogs.msdn.com/hsutter/archive/2003/11/23/53519.aspx
-- Gaby
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Nov 26, 2004 3:23 am Post subject: Re: Initialisation de variable (!) |
|
|
On 26 Nov 2004 03:35:52 +0100, Gabriel Dos Reis
<gdr (AT) integrable-solutions (DOT) net>:
Pourquoi faire simple quand on peut faire compliqué...
Z'ont même pas été fichus de pondre des mots-clés commençant
par "__" -- c'est pourtant une technique assez classique pour
définir des mots-clefs spéfiques à un compilo et/ou un système.
--
;-)
|
|
| Back to top |
|
 |
Aurélien REGAT-BARREL Guest
|
Posted: Fri Nov 26, 2004 12:53 pm Post subject: Re: Initialisation de variable (!) |
|
|
| Quote: | Pourquoi faire simple quand on peut faire compliqué...
Z'ont même pas été fichus de pondre des mots-clés commençant
par "__" -- c'est pourtant une technique assez classique pour
définir des mots-clefs spéfiques à un compilo et/ou un système.
|
C'est déjà fait avec Managed C++, et c'est imbitable comme syntaxe. Faut
pourrir ton code de mot clés genre __gc et c'est super lourd.
Y'en a un qui est "marrant" : __identifier, qui permet d'utiliser un mot clé
comme identifieur.
http://msdn.microsoft.com/library/en-us/vcmex/html/vclrf__identifier.asp
Si j'ai bien compris Managed C++ c'est une extension MS au C++ standard,
alors que C++ CLI c'est un nouveau langage (et si j'ai bien compris encore
Intel et Comeau travaillent à un compilateur dessus, en plus de MS biensûr).
http://download.microsoft.com/download/9/9/c/99c65bcd-ac66-482e-8dc1-0e14cd1670cd/C++-CLI%20Standard.pdf
--
Aurélien REGAT-BARREL
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Fri Nov 26, 2004 2:49 pm Post subject: Re: Initialisation de variable (!) |
|
|
"Aurélien REGAT-BARREL" <nospam-aregatba (AT) yahoo (DOT) fr.invalid> writes:
Tu n'as qu'à moitié bien compris ;-)
-- Gaby
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|