2011-06-14 3 views
2

Je consolide 2 programmes en un, et dans 2 fichiers différents (j'ai beaucoup de fichiers), j'ai un typedef avec le même nom, des types différents cependant.faire un typedef local à un fichier ou sous-classes

Ces types seront utilisés dans des parties complètement différentes du programme et ne se parleront jamais, ou ne seront pas utilisés de manière interchangeable.

Je peux juste faire une recherche remplacer dans un des fichiers, mais je me demandais s'il y a une autre solution à cela.

Quelque chose comme lier un typedef à un fichier spécifique. Ou en faisant un typedef local à une classe et ses sous-classes.

Merci

+0

Je pense que le plus simple pourrait être simplement de renommer le typedef manuellement. –

+1

Cest ce que [namespaces] (http://www.cplusplus.com/doc/tutorial/namespaces/) sont pour. – Node

+0

Les auteurs originaux devraient avoir utilisé des espaces de noms. C'est ce qu'ils sont pour. Et comme vous le voyez maintenant, "Mon programme est assez petit pour ne pas avoir besoin d'espaces de noms" n'est pas une excuse pour ne pas utiliser les espaces de noms. – Oswald

Répondre

4

Vous pouvez encapsulent les typedef dans un namespace:

namespace N1 { 
    typedef int T; 
} 
namespace N2 { 
    typedef int T; 
} 

Et quel que soit le fichier que vous souhaitez utiliser d'abord typedef déclarer simplement:

using namespace N1; 

même chose pour l'autre un aussi.

6

typedef s sont toujours "local dans un fichier". Il n'est donc pas clair de savoir ce que vous entendez par «le rendre local dans un fichier». Typedef n'introduit pas une entité avec son propre lien, il crée simplement un alias à un type existant. Pour cette raison, le problème de "le rendre local dans un fichier" n'existe tout simplement pas. Chaque typedef n'est visible que dans l'unité de traduction (fichier) dans laquelle il est déclaré. Donc, si vous pouvez vous assurer que vos typedef ne se rencontrent jamais dans une unité de traduction commune, votre problème est formellement résolu. Il n'est pas bon de programmer que le même typedef-name fasse référence à des types différents dans des fichiers différents, à moins que ces fichiers ne soient naturellement séparés (comme des bibliothèques différentes, ou quelque chose comme ça). Sinon, vous pouvez toujours renommer l'un des typedef s, ou en faire un membre de classe ou un membre d'espace de noms. Gardez à l'esprit que, dans le cas général, la création d'un typedef membre d'une classe nécessitera pratiquement le même type d'effort que de le renommer: les références à ce typedef devront être mises à jour à chaque endroit où elles sont présentes. Les espaces de noms peuvent être un peu plus faciles, car avec les espaces de noms, vous pouvez utiliser la directive using.

Mais encore une fois, si vos typedef s ne sont référencés qu'à partir de deux ensembles de fichiers disjoints, alors le problème n'existe pas formellement. S'il y a des fichiers qui sont censés utiliser les deux typedef s, alors l'effort que vous aurez à passer à réparer ces fichiers équivaudra à renommer les typedef s (quelle que soit la méthode que vous choisissez finalement).

+1

Si un 'typedef' est dans un fichier d'en-tête qui est inclus partout alors il ne sera pas local au fichier. – iammilind

+0

L'unité de traduction peut inclure plus d'un fichier, si le typedef est dans un en-tête, il sera "global" pour tous les fichiers qui incluent cet en-tête. Cela étant dit, s'ils sont, comme l'indique la question, des éléments de code complètement indépendants, ils ne devraient pas partager les inclusions. +1 –

+0

@iammilind: Il sera local pour chaque fichier dans lequel il est inclus. Et chaque fichier aura son propre 'typedef' indépendant. Ainsi, il appartient à l'auteur du code de décider où inclure ce 'typedef' et où ne pas inclure. Si le 'typedef' est utilisé, il doit être inclus. S'il n'est pas utilisé, il ne doit pas nécessairement être inclus. Il n'y a pas de place ici pour "le rendre local dans un fichier". Il n'y a tout simplement pas de concept tel que "rendre' typedef' local à un fichier "en C++. – AnT

1

[...] Ou de faire un typedef local à une classe et ses sous-classes.

Eh bien, c'est simple:

struct A 
{ 
typedef int X; 
}; 

struct B : A 
{ 
X a; 
}; 

struct C 
{ 
typedef double X; 
}; 

Typedefs sont SCOPED en C++.

Questions connexes