6

我遇到了一些具有以下内容的 C++ 代码:

typedef Request Request;

这只是一个无操作还是这个 typedef 实际有效果,如果有,它有什么效果?

4

2 回答 2

9

您可以在第 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 重新定义类型以别名为另一个类型

于 2012-05-24T15:57:23.113 回答
1

如果 Request仅作为参数传递,它似乎是一个不透明的指针
应该有一个

typedef struct Request Request 

代码中的某处。(请参阅对您问题的评论)
这用于定义 API 并隐藏实现细节。因此,您可以稍后更改实现,而无需再次更改 API。

客户不需要知道关于实际类型的任何信息——它只是一种句柄。
你想用它做的所有事情都必须通过 api 方法(创建、删除、加载、初始化……)来完成。
通常,在 api 的实现中,句柄Request将被转换为更有意义的东西。这通常在C中完成。

于 2012-05-24T16:12:04.063 回答