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 

pinaillage sur typedef
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Fabien CHÊNE
Guest





PostPosted: Sat Jun 10, 2006 4:43 am    Post subject: pinaillage sur typedef Reply with quote



Bonjour,

Une question qui me tarabuste, Qu'est-ce qui a motivé la norme a
déclarer ce code illégal ? (selon $7.1.3.3) :

class Foo;
typedef int Foo;

A noter que l'exemple illustratif de $7.1.3.3 se sent obliger de
montrer une définition. Dans $7.1.3.3, Je note aussi que le diagnostic
indiqué de «typedef int complex;» (suite à class complex { /*
.... */}Wink est une redéfinition (alors que typedef fait une
déclaration).


En fait, ce serait pas mal qu'un «typedef-name» soit un «class-name»,
même s'il ne nommme pas une classe. Je suppose que cela serait source
de problèmes, mais, si c'est bien le cas, j'avoue ne pas le(s) voir du
premier coup d'oeil.

Merci d'avance.

--
Fab
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jun 10, 2006 9:11 am    Post subject: Re: pinaillage sur typedef Reply with quote



On 10 Jun 2006 09:06:41 +0200, Jean-Marc Bourguet <jm (AT) bourguet (DOT) org>:

Quote:
class Foo;
typedef int Foo;

Je ne vois pas quel est le problème avec ça. [...]

La vraie question est plutôt pourquoi

typedef class Foo Foo;

Je veux bien que ce soit une question intéressante, mais je ne vois
pas le rapport.
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sat Jun 10, 2006 9:11 am    Post subject: Re: pinaillage sur typedef Reply with quote



fabien.chene (AT) gmail (DOT) com (Fabien CHÊNE) writes:

Quote:
Une question qui me tarabuste, Qu'est-ce qui a motivé la
norme a déclarer ce code illégal ? (selon $7.1.3.3) :

class Foo;
typedef int Foo;

Je ne vois pas quel est le problème avec ça. Un nom
introduit par typedef est utilisé dans les mêmes contextes
que les noms de type, une surcharge n'est donc pas
résolvable par le contexte.

La vraie question est plutôt pourquoi

typedef class Foo Foo;

est autorisé. La raison est la compatibilité avec le C ou

struct S;

n'introduit pas S comme nom de type et donc il est courant
de faire

typedef struct S S;

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jun 10, 2006 9:11 am    Post subject: Re: pinaillage sur typedef Reply with quote

On Sat, 10 Jun 2006 01:43:39 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
CHÊNE):

Quote:
Une question qui me tarabuste, Qu'est-ce qui a motivé la norme a
déclarer ce code illégal ? (selon $7.1.3.3) :

class Foo;
typedef int Foo;

Je n'ai pas la version officielle, mais je suppose que ça vient du
fait qu'on peut écrire :

class Foo;

void f (int);
void f (Foo);

Si tu écris "typedef int Foo;", tout à coup les deux fonctions "f()"
deviennent identiques :

void f (int);
void f (int);
Back to top
Fabien CHÊNE
Guest





PostPosted: Sat Jun 10, 2006 9:11 am    Post subject: Re: pinaillage sur typedef Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On Sat, 10 Jun 2006 01:43:39 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
CHÊNE):

Une question qui me tarabuste, Qu'est-ce qui a motivé la norme a
déclarer ce code illégal ? (selon $7.1.3.3) :

class Foo;
typedef int Foo;

Je n'ai pas la version officielle, mais je suppose que ça vient du
fait qu'on peut écrire :

class Foo;

void f (int);
void f (Foo);

Prenons cet exemple, sinon Foo est un type incomplet.
class Foo;
void f( int& );
void f( Foo& );


Quote:
Si tu écris "typedef int Foo;", tout à coup les deux fonctions "f()"
deviennent identiques :

void f (int);
void f (int);

ça, c'est légal. Par contre pour les définitions, effectivement, il y
aura un problème :

typedef int Foo;
void f( int& ) {}
void f( Foo& ) {} // double définition


--
Fab
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jun 10, 2006 2:15 pm    Post subject: Re: pinaillage sur typedef Reply with quote

On Sat, 10 Jun 2006 11:19:10 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
CHÊNE):

Quote:
Prenons cet exemple, sinon Foo est un type incomplet.
class Foo;
void f( int& ); // 1
void f( Foo& ); // 2

Là, tu déclares deux fonctions différentes.

Si tu rajoutes
typedef int Foo;

tout à coup, les deux fonctions différentes sont la même.


En fait, l'idée est que écrire

class Foo;

indique que "Foo" est un nouveau type.

Alors que écrire
typedef int Foo;

indique que "Foo" est un alias pour "int". À la portée près, c'est
quasiment la même chose que
#define Foo int

Les deux déclarations sont donc incompatibles.
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jun 10, 2006 3:26 pm    Post subject: Re: pinaillage sur typedef Reply with quote

On Sat, 10 Jun 2006 01:43:39 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
CHÊNE):

Quote:
Je note aussi que le diagnostic
indiqué de «typedef int complex;» (suite à class complex { /*
... */}Wink est une redéfinition

(alors que typedef fait une déclaration).

typedef ne déclare rien, sinon une nouvelle orthographe pour un type.
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jun 10, 2006 3:30 pm    Post subject: Re: pinaillage sur typedef Reply with quote

On Sat, 10 Jun 2006 13:17:06 +0200, Fabien CHÊNE :

Quote:
Considérons que ceci est légal :
class Foo;
typedef int Foo;

Il s'en suit qu'il y a deux déclarations identiques, ce qui n'est pas
encore génant.

Comment ça, pas gênant ?

Tu dis que Foo est un nouveau type, puis tu dis que "Foo" veut dire
"int".

Devant cette contradiction patente, le compilateur jette l'éponge.


C'est aussi absurde que d'écrire
char x; double x;
Back to top
Fabien CHÊNE
Guest





PostPosted: Sat Jun 10, 2006 4:17 pm    Post subject: Re: pinaillage sur typedef Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On Sat, 10 Jun 2006 11:19:10 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
CHÊNE):

Prenons cet exemple, sinon Foo est un type incomplet.
class Foo;
void f( int& ); // 1
void f( Foo& ); // 2

Là, tu déclares deux fonctions différentes.

Si tu rajoutes
typedef int Foo;

tout à coup, les deux fonctions différentes sont la même.

Considérons que ceci est légal :
class Foo;
typedef int Foo;

Il s'en suit qu'il y a deux déclarations identiques, ce qui n'est pas
encore génant. Si les deux fonctions f sont définis, le compilateur
diagnostiquera une double définition (*).
Est-ce génant ? On pourrait voir la définition de la fonction
f(int&){} comme une interdiction à Foo de nommer un int.

(*) sauf si les fonctions sont inline, et ont la même définition --
mais je crois qu'il n'y a que le front end d'EDG qui arrive à
diagnostiquer cela.

Ensuite, que se passe-t'il si (1) est spécifié inline et pas (2) ?
Si (2) est spécifié inline et pas (1) ?

ça devient tordu :-)

Quote:
En fait, l'idée est que écrire

class Foo;

indique que "Foo" est un nouveau type.

Alors que écrire
typedef int Foo;

indique que "Foo" est un alias pour "int".

Les deux déclarations sont donc incompatibles.

Je ne sais pas si cette notion existe dans la norme. Si elle l'est,
alors le commentaire de §7.1.3.3 me parait de plus en plus bizarre.


--
Fab
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jun 10, 2006 4:35 pm    Post subject: Re: pinaillage sur typedef Reply with quote

class C;

void f (C&);
int f (int&);

typedef int C;
Back to top
Fabien CHÊNE
Guest





PostPosted: Sat Jun 10, 2006 4:43 pm    Post subject: Re: pinaillage sur typedef Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On Sat, 10 Jun 2006 13:17:06 +0200, Fabien CHÊNE :

Considérons que ceci est légal :
class Foo;
typedef int Foo;

Il s'en suit qu'il y a deux déclarations identiques, ce qui n'est pas
encore génant.

Comment ça, pas gênant ?

Tu dis que Foo est un nouveau type, puis tu dis que "Foo" veut dire
"int".

Devant cette contradiction patente, le compilateur jette l'éponge.

Désolé, je n'ai pas mis assez de contexte :

Je suppose que ceci est légal :
class Foo;
typedef int Foo;

Et je fais

void f( int& );
void f( Foo& );

//je défini Foo et les f plus tard.

Les déclarations identiques dont je parlais sont celles de f.

--
Fab
Back to top
Fabien CHÊNE
Guest





PostPosted: Sat Jun 10, 2006 4:44 pm    Post subject: Re: pinaillage sur typedef Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
typedef ne déclare rien, sinon une nouvelle orthographe pour un type.

§3.1.3 dit que c'est une déclaration.

--
Fab
Back to top
Fabien CHÊNE
Guest





PostPosted: Sat Jun 10, 2006 4:50 pm    Post subject: Re: pinaillage sur typedef Reply with quote

fabien.chene (AT) gmail (DOT) com (Fabien CHÊNE) writes:

Quote:
[...]
Désolé, c'était toujours aussi clair ...


Pour être plus clair

Je suppose que ceci est légal :
class Foo;
typedef int Foo;

Et je fais :

class Foo;
typedef int Foo;

void f( int& );
void f( Foo& );

//je défini les f plus tard.

Les déclarations identiques dont je parlais sont celles de f.

--
Fab
Back to top
James Kanze
Guest





PostPosted: Sun Jun 11, 2006 1:24 am    Post subject: Re: pinaillage sur typedef Reply with quote

Fabien CHÊNE wrote:

Quote:
Une question qui me tarabuste, Qu'est-ce qui a motivé la norme
a déclarer ce code illégal ? (selon $7.1.3.3) :

class Foo;
typedef int Foo;

Je me poserais plutôt la question inverse : qu'est-ce qui
pouvait être l'intérêt de le permettre ?

Note bien qu'on ne pourrait pas permettre une utilisation de Foo
entre les deux, parce que rien ne garantit que la taille et le
format des pointeurs vers une classe sont identiques à ceux vers
un int -- et l'intérêt de « class Foo ; », c'est bien de pouvoir
déclarer un « Foo* ».

Quote:
A noter que l'exemple illustratif de $7.1.3.3 se sent obliger
de montrer une définition. Dans $7.1.3.3, Je note aussi que le
diagnostic indiqué de «typedef int complex;» (suite à class
complex { /* ... */}Wink est une redéfinition (alors que typedef
fait une déclaration).

Le typedef est bien une déclaration, mais même une déclaration
définit bien le symbole (sinon l'objet, le type ou la fonction
que le symbole désigne).

Quote:
En fait, ce serait pas mal qu'un «typedef-name» soit un
«class-name», même s'il ne nommme pas une classe.

Ce ne serait pas mal, en effet. Malheureusement, ça ne se laisse
pas implémenter avec les techniques courantes.

Quote:
Je suppose que cela serait source de problèmes, mais, si c'est
bien le cas, j'avoue ne pas le(s) voir du premier coup d'oeil.

Considère l'implémentation classique des fonctions, avec le
name-mangling:

class Foo ;
void f( Foo* ) ; // définit le nom __1f_3Foo, par exemple...

// ...
typedef int Foo ;

void f( Foo* pi ) // le nom ici est __1f_i, ou quelque chose comme
ça...
{
}

--
James Kanze kanze.james (AT) neuf (DOT) 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
Serge Paccalin
Guest





PostPosted: Sun Jun 11, 2006 9:11 am    Post subject: Re: pinaillage sur typedef Reply with quote

Le dimanche 11 juin 2006 à 08:58:40, Fabien LE LEZ a écrit dans
fr.comp.lang.c++ :

Quote:
On Sat, 10 Jun 2006 22:24:57 +0200, James Kanze <kanze.james (AT) neuf (DOT) fr>:

class Foo;
typedef int Foo;

Je me poserais plutôt la question inverse : qu'est-ce qui
pouvait être l'intérêt de le permettre ?

Je ne connaissais pas le problème de taille de pointeur, mais
j'aimerais bien pouvoir faire :

// A.h

class A
{
// Un truc immense
};

// X.h

class B;

class X
{
B *ptr;
};

// Jusque-là, rien que du classique...

// X.cpp

#include "X.h"
#include "A.h"

typedef A B; // Pas possible malheureusement

On peut obtenir un truc de ce genre avec les templates :

// A.h -- inchangé

// X.h
template <typename B>
class X
{
B *ptr;
};

// X.cpp

#include "X.h"
#include "A.h"

// Instancier X<A>, c'est possible

--
___________ 11/06/2006 09:38:59
_/ _ \_`_`_`_) Serge PACCALIN -- sp ad mailclub.net
\ \_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).
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  Next
Page 1 of 2

 
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.