我遇到了一些C++代码,其中包含以下内容:
typedef Request Request;
这只是一个无操作还是这个 typedef 实际上有效果,如果是这样,它有什么效果?
您可以在第 7.1.3 节中阅读与 C++2003 ANSI ISO IEC 14882 2003 的 typedef 说明符相关的所有规则。在 7.1.3, 2) 中,有人说如果名称已经引用了某种类型,则允许使用标识 typedef。
这是合法的:
typedef int Request;
typedef Request Request; // Redefines "Request" with no effect
而且它不是:
typedef Request Request; // Illegal, first "Request" doesn't name a type.
该标准有一个与此相关的具体示例。C++2003, §7.1.3/2:
在给定的非类作用域中,typedef 说明符可用于重新定义 中声明的任何类型的名称 该范围引用它已引用的类型。[示例:
typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;
—结束示例]
在 7.1.3, 3) 中,有人说禁止使用 typedef 将类型重定义为别名到另一种类型
如果Request
仅作为参数传递,则它似乎是一个不透明的指针。
应该有一个
typedef struct Request Request
在代码中的某个地方。(请参阅对您的问题的评论)
这用于定义 API 和隐藏实现详细信息。因此,您可以稍后更改实现,而无需再次更改 API。
客户不需要知道任何关于针尖类型的信息 - 它只是一个手柄。
你想用它做的所有事情都必须通过 api 方法完成(创建、删除、加载、初始化......
通常,句柄Request
将在 API 的实现中转换为更有意义的内容。这通常是在旧 C 中完成的。