Est-ce qu'un typedef à soi-même a un effet?

J'ai rencontré un code C ++ qui a ce qui suit:

typedef Request Request;

Est-ce juste un no-op ou est-ce que ce typedef actuel a un effet, et si oui, quel effet cela a-t-il?

0
Cela pourrait faire quelque chose si Request était une macro.
ajouté l'auteur Mankarse, source
Oui, c'est vraiment typedef Request Request , et Request a déjà été défini, mais je ne sais pas si c'est le même espace de noms ou non.
ajouté l'auteur WilliamKF, source
Êtes-vous sûr que ce n'était pas typedef struct Request Request ?
ajouté l'auteur Graham Borland, source
Est-ce que Request a été défini dans le même espace de noms?
ajouté l'auteur K-ballo, source

2 Réponses

Vous pouvez lire toutes les règles relatives au spécificateur typedef pour C ++ 2003 ANSI ISO CEI 14882 2003 dans la section 7.1.3. En 7.1.3, 2) il a été dit que l'identité typedef est autorisée si le nom fait déjà référence à un certain type.

C'est légal:

typedef int Request;
typedef Request Request;//Redefines "Request" with no effect 

Et ce n'est pas:

typedef Request Request;//Illegal, first "Request" doesn't name a type. 

La norme a un exemple spécifique relatif à ceci. C ++ 2003, §7.1.3/2:

Dans une portée non-classe donnée, un spécificateur typedef peut être utilisé pour redéfinir le nom de tout type déclaré dans   cette portée pour se référer au type auquel il se réfère déjà. [ Exemple :

typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;

- fin exemple ]

En 7.1.3, 3) il a été dit que l'utilisation de typedef pour redéfinir le type à alias à un autre type est interdite

0
ajouté
Quelle est la différence entre eux? Votre message n'est pas assez clair, car je vois le même double typedef deux fois, mais l'un d'eux est légal, l'autre ne l'est pas.
ajouté l'auteur Nawaz, source
La différence entre mon premier bloc et mon deuxième bloc est la définition préalable de "Demande".
ajouté l'auteur Robᵩ, source

If Request is only passed as a parameter it seems to be a opaque pointer.
There should be a

typedef struct Request Request 

quelque part dans le code. (voir les commentaires sur votre question)
Ceci est utilisé pour définir une API et masquer les détails d'implémentation. Vous pouvez donc modifier ultérieurement l'implémentation sans modifier à nouveau l'API.

Le client n'a pas besoin de savoir quoi que ce soit sur le type acutal - c'est juste une sorte de poignée.
Tout ce que vous voulez faire avec cela doit être fait avec les méthodes api (création, suppression, chargement, init, ...)
Habituellement, le handle Request sera converti en quelque chose de plus significatif dans l'implémentation de l'API. C'était/est habituellement fait dans vieux C.

0
ajouté
C'est une question C ++. Contrairement à C, en C ++, le nom de structure nomme automatiquement le type, donc je ne sais pas pourquoi vous auriez typedef struct Request Request n'importe où. En tant que déclaration directe, il suffirait d'avoir struct Request; . Ou est-ce que je manque quelque chose ici?
ajouté l'auteur hyde, source