2010-12-12 67 views
3

Je n'aime pas personnellement ancien style C des déclarations struct comme ça:utilisant typedef en déclarant struct en C++

typedef struct {} NewType; 

ctags fait types anon laid de cela et rendent le débogage difficile. Y a-t-il une raison quelconque dans le code C++ utilisant typedef struct au lieu de simplement struct, sauf que le code est utilisé dans C et C++?

Cordialement, Valentin

+0

http://stackoverflow.com/questions/385023/why-do-you-use-typedef-when-declaring-an-enum-in-c – Pratik

Répondre

3

Un inconvénient majeur de ces

typedef struct tagSomethingSomething SomethingSomething; 

est que, en avant-déclarations ne sont pas possibles avec le nom typedef'fed couramment utilisé.

Oui, il est un C-ism (kudos OSMŒ) et il y a des C++ - codebases, où - malheureusement - (encore) est commun.

+0

Il est une bonne raison, je vais vérifier ça! Pour être honnête, je cherche actuellement des raisons de persuader mes collègues de ne pas utiliser typedef dans ce cas. Mais malheureusement, je ne pouvais pas trouver de raisons, sauf ennuyeux anon-types dans le débogueur (ils utilisent le débogage printf) et vieux style C (ils en sont fiers). –

+0

Valentin: bonne chance dans votre conquête :) J'ai encore des collègues qui - dans une base de code C++ - utilisent des noms de tags et des typedefs ... Il n'y a vraiment aucun argument ** pour ** typedefs en C++, on ne devrait pas avoir à persuader autres. Cheers –

+2

@Valentin: Un argument serait: Comment écrivez-vous un constructeur pour une telle structure? Les déclarations anticipées, déjà mentionnées par Fritschy, en sont une autre. – sbi

3

C'est une C-isme. En C, struct et énumérations ont effectivement leur un namespaces, donc pour

struct NewType {}; 
enum SomeEnum {}; 

vous devriez écrire struct NewType et enum SomeEnum se référer.

En C++, cela n'est pas nécessaire. Donc, à moins d'écrire un en-tête qui doit être analysé par un compilateur C, vous ne devriez pas l'utiliser non plus.

-1

@sbi: Je pense que non: peut être faux, mais .. en C++ ce n'est pas une structure anonyme, il y a une règle spéciale appelée "struct hack" qui fait une structure ordinaire taguée avec le nom typedef, donc le nom typedef devient aussi le nom de la classe. Ceci est nécessaire car les fonctions avec liaison externe requièrent également des arguments de type classe pour avoir un lien externe, ce qui implique d'avoir un nom externe. Sans ce hack, seules les fonctions externes "C" pourraient manipuler la structure.

Le seul endroit où vous pouvez utiliser une struct anonyme serait dans une autre structure:

struct X { struct {int a; } b; } x; 
x.b.a; // OK 

struct X a une liaison externe, même si le type de b est anonyme. Les structures anonymes pourraient être utilisées sur la pile ou dans le stockage statique, mais contrairement aux unions anonymes, cela ne fournirait aucun avantage sur les variables séparées. Je ne suis même pas sûr que C++ permette des structures anonymes.

+0

-1. Désolé, je n'ai pas compris comment cela s'appuyait sur ma question. –

+0

Le point est votre texte original indiqué ** incorrectement ** que les structures typedef'ed style C sans tags étaient des structures anonymes. Ce n'est pas correct en C++, ce ne sont pas des structures anonymes, le nom typedef est pris comme un nom de balise et un nom de classe et le type résultant a même un lien externe. Donc, en fait, vous devriez utiliser la forme non-typedef, puisque même vous vous êtes trompé sur la sémantique quand un typedef a été utilisé, en espérant qu'il soit simplement un alias pour une structure anonyme (qui n'aurait pas de lien externe). – Yttrill