我遇到了一些具有以下内容的 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;
—<em>结束示例]
在 7.1.3, 3) 中已经说过禁止使用 typedef 重新定义类型以别名为另一个类型
如果 Request
仅作为参数传递,它似乎是一个不透明的指针。
应该有一个
typedef struct Request Request
代码中的某处。(请参阅对您问题的评论)
这用于定义 API 并隐藏实现细节。因此,您可以稍后更改实现,而无需再次更改 API。
客户不需要知道关于实际类型的任何信息——它只是一种句柄。
你想用它做的所有事情都必须通过 api 方法(创建、删除、加载、初始化……)来完成。
通常,在 api 的实现中,句柄Request
将被转换为更有意义的东西。这通常在旧C中完成。