 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Fabien CHÊNE Guest
|
Posted: Sat Jun 10, 2006 4:43 am Post subject: pinaillage sur typedef |
|
|
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 { /*
.... */} 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
|
Posted: Sat Jun 10, 2006 9:11 am Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 9:11 am Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 9:11 am Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 9:11 am Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 2:15 pm Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 3:26 pm Post subject: Re: pinaillage sur typedef |
|
|
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 { /*
... */} 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
|
Posted: Sat Jun 10, 2006 3:30 pm Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 4:17 pm Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 4:35 pm Post subject: Re: pinaillage sur typedef |
|
|
class C;
void f (C&);
int f (int&);
typedef int C; |
|
| Back to top |
|
 |
Fabien CHÊNE Guest
|
Posted: Sat Jun 10, 2006 4:43 pm Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 4:44 pm Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sat Jun 10, 2006 4:50 pm Post subject: Re: pinaillage sur typedef |
|
|
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
|
Posted: Sun Jun 11, 2006 1:24 am Post subject: Re: pinaillage sur typedef |
|
|
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 { /* ... */} 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
|
Posted: Sun Jun 11, 2006 9:11 am Post subject: Re: pinaillage sur typedef |
|
|
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 |
|
 |
|
|
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
|
|