6
votes

Faire un local Typedef à un fichier ou sous-classes

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.

Ces types seront utilisés dans des parties complètement différentes du programme et ne se parleront jamais, ni être utilisées interackangely.

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

Quelque chose comme la liaison d'un type à un fichier spécifique. Ou faire un typlef local à une classe et ses sous-classes.

merci


3 commentaires

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.


3 Réponses :


4
votes

Vous pouvez encapsuler ces Typedef à l'intérieur d'un espace de noms : xxx

et dans n'importe quel fichier que vous souhaitez utiliser le premier Typedef déclarez simplement: xxx

même chose pour l'autre aussi.


0 commentaires

7
votes

Typedef s sont toujours "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 ne se rencontre jamais dans une unité de traduction commune, votre problème est formellement résolu.

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).

Sinon, vous pouvez toujours renommer l'un des Typedef 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 d'une classe nécessitera pratiquement le même type d'effort que le renommer: les références à ce Typedef 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 .

Mais encore une fois, si votre Typedef 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 S, alors l'effort que vous devrez passer à la réparation de ces fichiers sera équivalent à la renommage du Typedef S (peu importe la méthode que vous choisissez enfin).


3 commentaires

Si un Typedef 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 . Donc, 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 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 local à un fichier" en C ++.



2
votes

[...] 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;
}; 

0 commentaires