Je consolide 2 programmes en un, et dans 2 fichiers différents (j'ai de nombreux fichiers), j'ai un typlef avec le même nom, différents types cependant. p>
Ces types seront utilisés dans des parties complètement différentes du programme et ne se parleront jamais, ni être utilisées interackangely. P>
Je peux simplement faire une recherche Remplacer dans l'un des fichiers, mais je me demandais s'il y a une autre solution à cela. P>
Quelque chose comme la liaison d'un type à un fichier spécifique. Ou faire un typlef local à une classe et ses sous-classes. P>
merci p>
3 Réponses :
Vous pouvez encapsuler ces et dans n'importe quel fichier que vous souhaitez utiliser le premier même chose pour l'autre aussi. p> p> Typedef code> à l'intérieur d'un espace de noms code>:
Typedef code> déclarez simplement: p>
Ce n'est pas une bonne pratique de programmation, cependant d'avoir le même nom TypeDEF se référer à différents types de fichiers différents, à moins que ces fichiers soient séparés naturellement (comme appartiennent à différentes bibliothèques, ou quelque chose comme ça). P>
Sinon, vous pouvez toujours renommer l'un des Mais encore une fois, si votre Typedef code> s sont toujours em> "local dans un fichier". Donc, ce n'est pas clairement clair ce que vous entendez par «le rendre local dans un fichier». TLECDEF n'introduit pas une entité avec son propre lien, elle 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 elle est déclarée. Donc, si vous pouvez vous assurer que votre
TypeDef code> ne se rencontre jamais dans une unité de traduction commune, votre problème est formellement résolu. p>
Typedef code> S, ou en faire un membre de la classe ou un membre d'espace de noms. Gardez à l'esprit que, en général cas, la fabrication d'un
Typedef code> d'une classe nécessitera pratiquement le même type d'effort que le renommer: les références à ce
Typedef code> devront être mis à jour dans chaque endroit où ils sont présents. Les espaces de noms peuvent être un peu plus faciles, car avec des espaces de noms, vous pouvez utiliser
en utilisant la directive code>. P>
Typedef code> S ne sont réfontionnés que de deux ensembles disjoints de fichiers, le problème n'existe pas formellement. S'il y a des fichiers censés utiliser les deux
typedef code> S, alors l'effort que vous devrez passer à la réparation de ces fichiers sera équivalent à la renommage du
Typedef code> S (peu importe la méthode que vous choisissez enfin). P>
Si un Typedef code> est dans un fichier d'en-tête inclus partout, il ne sera pas local dans le fichier.
L'unité de traduction peut inclure plusieurs fichiers, si la TYPEDEF est dans une en-tête, elle sera "globale" à tous les fichiers qui incluent cet en-tête. Cela étant dit, s'ils sont, comme la question indique, des pièces de code complètement indépendantes, elles ne devraient pas partager la complets. +1
@iammilind: Il sera local à chaque fichier dans lequel il est inclus. Et chaque fichier aura son propre Typedef code>. Donc, il appartient à l'auteur du code de décider où inclure ce
Typedef code> et où ne pas inclure. Si le
Typedef code> est utilisé, il doit être inclus. S'il n'est pas utilisé, il n'est pas nécessaire d'être inclus. Il n'y a pas de place ici pour tout "rendant la locale dans un fichier". Il n'y a tout simplement pas de concept de tel que "rendant
Typedef code> local à un fichier" en C ++.
[...] ou faire un local Typedef à une classe et c'est des sous-classes. P>
Eh bien, c'est simple: p>
struct A { typedef int X; }; struct B : A { X a; }; struct C { typedef double X; };
Je pense que le plus facile pourrait être juste de renommer manuellement la typlef.
C'est ce que Les espaces de noms sont pour.
Les auteurs d'origine auraient dû utiliser des espaces de noms. C'est ce qu'ils sont pour. Et comme vous le voyez maintenant, "mon programme est suffisamment petit pour que je n'ai pas besoin d'espaces de noms" n'est pas une excuse pour ne pas utiliser les espaces de noms.