我遇到了一些具有以下内容的C ++代码:
typedef Request Request;
这只是一个无操作或者这个typedef实际有效果吗?如果有,它有什么影响?
答案 0 :(得分: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;
- 结束示例]
在7.1.3中,3)已经说过禁止使用typedef将类型重新定义为别名为别名
答案 1 :(得分:1)
如果 Request
仅作为参数传递,则似乎是opaque pointer。
应该有一个
typedef struct Request Request
代码中的某个地方。 (见你对问题的评论)
这用于定义API并隐藏实现细节。因此,您可以稍后更改实施,而无需再次更改API。
客户不需要了解关于实际类型的任何信息 - 它只是一种句柄
你想用它做的一切都必须用api方法完成(创建,删除,加载,初始化......)
通常句柄Request
将被转换为在api的实现中更有意义的东西。这通常是在旧 C中完成的。