使 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】:

typedefs 总是“本地文件”。因此,“使其成为文件本地”的意思并不完全清楚。 Typedef 不引入具有自己链接的实体,它只是为现有类型创建别名。出于这个原因,“使其成为文件本地”的问题根本不存在。每个 typedef 仅在声明它的翻译单元(文件)中可见。所以,如果你能确保你的同名typedefs 永远不会在一个共同的翻译单元中相遇,那么你的问题就正式解决了。

虽然在不同的文件中使用相同的 typedef-name 来指代不同的类型,但这并不是一个好的编程习惯,除非这些文件以某种方式自然地分开(比如属于不同的库,或类似的东西)。

否则,您始终可以重命名typedefs 之一,或使其成为类成员或命名空间成员。请记住,在一般情况下,创建一个类的 typedef 成员将需要与重命名它几乎相同的努力:对 typedef 的引用必须在它们存在的每个地方更新.命名空间可能会更容易一些,因为有了命名空间,您可以使用 using 指令。

但同样,如果您的typedefs 只是来自两个不相交的文件集的引用,那么问题并不正式存在。如果有文件应该同时使用typedefs,那么您必须花费修复这些文件的工作将等同于重命名typedefs(无论您最终选择哪种方法)。

【讨论】:

如果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 本地化到文件或子类的主要内容,如果未能解决你的问题,请参考以下文章

如何使本地化的 Storyboard 或 XIB 保持同步?

本地备异地保存份

本地备异地保存份

使公共网站重新连接到本地 html 或 xampp

用js或jquery生成本地txt文件的代码

修改hosts文件在本地使域名解析到指定IP