对自己的typedef是否有影响?

我遇到过一些C ++代码,它们具有以下内容:

typedef Request Request;

这只是一个没有操作或这个typedef实际上有效果,如果是这样,它有什么影响?

0
额外 编辑
意见: 1
如果 Request 是一个宏,这可能会做一些事情。
额外 作者 Mankarse,
是的,它确实是 typedef Request Request ,并且之前已经定义了Request,但不确定它是否是相同的命名空间。
额外 作者 WilliamKF,
你确定它不是 typedef struct Request Request 吗?
额外 作者 Graham Borland,
是否在同一个命名空间中定义了 Request
额外 作者 K-ballo,

2 答案

您可以阅读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将类型重定义为另一种类型的别名

0
额外
他们有什么区别?你的帖子不够清楚,因为我看到两次相同的typedef,但其中一个是合法的,另一个不是。
额外 作者 Nawaz,
我的第一个区块和我的第二个区块之间的区别在于“请求”的先前定义。
额外 作者 Robᵩ,

If Request is only passed as a parameter it seems to be a opaque pointer.
There should be a

typedef struct Request Request 

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

客户不需要知道任何关于acutal类型的东西 - 它只是一种句柄。
你想用它做的一切都必须用api方法(创建,删除,加载,init,...)来完成 通常,处理 Request 将被执行到api中更具意义的东西。这通常是在 C完成的。

0
额外
这是C ++的问题。与C不同,在C ++中,struct name自动命名类型,所以我不确定为什么你在任何地方都有 typedef struct Request Request 。作为前向判断,只需 struct Request; 就足够了。或者我在这里错过了什么?
额外 作者 hyde,