C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Initialisation de variable (!)
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Aurélien REGAT-BARREL
Guest





PostPosted: Wed Nov 24, 2004 2:20 pm    Post subject: Initialisation de variable (!) Reply with 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.

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





PostPosted: Wed Nov 24, 2004 2:33 pm    Post subject: Re: Initialisation de variable (!) Reply with quote



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





PostPosted: Wed Nov 24, 2004 2:38 pm    Post subject: Re: Initialisation de variable (!) Reply with quote



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





PostPosted: Wed Nov 24, 2004 2:49 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Wed Nov 24, 2004 2:53 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Wed Nov 24, 2004 6:16 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Thu Nov 25, 2004 8:16 am    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Thu Nov 25, 2004 8:23 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

[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





PostPosted: Thu Nov 25, 2004 9:59 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Thu Nov 25, 2004 11:10 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Thu Nov 25, 2004 11:42 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Fri Nov 26, 2004 2:35 am    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Fri Nov 26, 2004 3:23 am    Post subject: Re: Initialisation de variable (!) Reply with quote

On 26 Nov 2004 03:35:52 +0100, Gabriel Dos Reis
<gdr (AT) integrable-solutions (DOT) net>:

Quote:
http://blogs.msdn.com/hsutter/archive/2003/11/23/53519.aspx

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





PostPosted: Fri Nov 26, 2004 12:53 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

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





PostPosted: Fri Nov 26, 2004 2:49 pm    Post subject: Re: Initialisation de variable (!) Reply with quote

"Aurélien REGAT-BARREL" <nospam-aregatba (AT) yahoo (DOT) fr.invalid> writes:

Quote:
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

Tu n'as qu'à moitié bien compris ;-)

-- Gaby

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.