使 typedef 本地化到文件或子类
Posted
技术标签:
【中文标题】使 typedef 本地化到文件或子类【英文标题】:making a typedef local to a file or subclasses 【发布时间】:2011-09-14 17:42:28 【问题描述】:我将 2 个程序合并为一个,在 2 个不同的文件(我有很多文件)中,我有一个同名的 typedef,但类型不同。
这些类型将用于程序的完全不同的部分,并且永远不会相互交流,也不会相互使用。
我当然可以在其中一个文件中进行搜索替换,但我想知道是否有其他解决方案。
类似于将 typedef 绑定到特定文件。 或者将 typedef 设置为类及其子类的本地类型。
谢谢
【问题讨论】:
我认为最简单的方法就是手动重命名 typedef。 这就是namespaces 的用途。 原作者应该使用过命名空间。这就是他们的目的。正如你现在看到的,“我的程序足够小,我不需要命名空间”并不是不使用命名空间的借口。 【参考方案1】:typedef
s 总是“本地文件”。因此,“使其成为文件本地”的意思并不完全清楚。 Typedef 不引入具有自己链接的实体,它只是为现有类型创建别名。出于这个原因,“使其成为文件本地”的问题根本不存在。每个 typedef 仅在声明它的翻译单元(文件)中可见。所以,如果你能确保你的同名typedef
s 永远不会在一个共同的翻译单元中相遇,那么你的问题就正式解决了。
虽然在不同的文件中使用相同的 typedef-name 来指代不同的类型,但这并不是一个好的编程习惯,除非这些文件以某种方式自然地分开(比如属于不同的库,或类似的东西)。
否则,您始终可以重命名typedef
s 之一,或使其成为类成员或命名空间成员。请记住,在一般情况下,创建一个类的 typedef
成员将需要与重命名它几乎相同的努力:对 typedef
的引用必须在它们存在的每个地方更新.命名空间可能会更容易一些,因为有了命名空间,您可以使用 using
指令。
但同样,如果您的typedef
s 只是来自两个不相交的文件集的引用,那么问题并不正式存在。如果有文件应该同时使用typedef
s,那么您必须花费修复这些文件的工作将等同于重命名typedef
s(无论您最终选择哪种方法)。
【讨论】:
如果typedef
位于头文件中,该头文件包含在任何地方,那么它将不是该文件的本地文件。
翻译单元可能包含多个文件,如果 typedef 在标头中,则对包含该标头的所有文件都是“全局”的。话虽如此,如果正如问题所述,它们是完全独立的代码片段,则它们不应共享包含。 +1
@iammilind:它对于包含它的每个文件都是本地的。每个文件都有自己独立的typedef
。因此,由代码的作者决定在哪里包含 typedef
以及在哪里不包含。如果使用typedef
,则必须包含它。如果不使用,则不必包括在内。这里没有任何“使其成为文件本地”的空间。 C++ 中根本没有“使typedef
成为文件的本地文件”这样的概念。【参考方案2】:
您可以将这些 typedef
封装在 namespace
中:
namespace N1
typedef int T;
namespace N2
typedef int T;
在你想首先使用的任何文件中 typedef
只需声明:
using namespace N1;
另一个也一样。
【讨论】:
【参考方案3】:[...]或者将 typedef 设置为类的本地 它是子类。
嗯,这很简单:
struct A
typedef int X;
;
struct B : A
X a;
;
struct C
typedef double X;
;
Typedef 的作用域在 C++ 中。
【讨论】:
以上是关于使 typedef 本地化到文件或子类的主要内容,如果未能解决你的问题,请参考以下文章