![]() |
1
10
首先,这两种声明在C和C++中都是合法的。然而,在C语言中,它们的语义略有不同。(尤其是,您以后引用结构的方式有所不同)。
要理解的关键概念是,在C中,结构存在于单独的名称空间中。
所有内置类型以及typedef都存在于“默认”命名空间中。也就是说,当我打字的时候
结构是不同的,并且存在于单独的命名空间中。因此,如果我做出以下声明:
我可以 不 简单地称之为“我的停战”。相反,我必须指定我想要存在于结构命名空间中的mystruct:
从长远来看,这会变得有点冗长和笨拙。相反,您可以将其类型化为默认命名空间:
现在,我的函数可以直接声明为:
所以第一个示例简单地将这两个步骤合并在一起:声明一个结构,并将别名放入常规名称空间。当然,因为我们要对它进行类型化处理,所以我们不需要“原始”名称,所以我们可以使结构匿名。所以在你申报之后
我们有一个没有名称的结构,它在默认命名空间中被类型化为“tagmystruct”。 这就是C对待它的方式。这两种类型的声明都有效,但其中一种声明不会在“默认”命名空间中创建别名,因此每次引用该类型时都必须使用struct关键字。 在C++中,单独的结构命名空间不存在,所以它们意味着同样的事情。(但最好是较短的版本)。 编辑 只是说清楚,不,C没有名称空间。不是一般意义上的。 C只需将标识符放入两个预定义名称空间中的一个。结构(和枚举,我记得)的名称放在一个中,所有其他标识符放在另一个中。从技术上讲,这些都是命名空间,因为它们是单独的“容器”,在这些容器中放置名称以避免冲突,但它们在C++/C意义上当然不是命名空间。 |
![]() |
2
10
如果你要写
每当您想要引用该类型时,必须指定您所说的是一个结构:
对于typedef版本:
你只需要写:
TyPulfEd版本的另一个大优点是,可以在C和C++中以相同的方式引用结构,而在第二个版本中,C引用的结构与C++中的不同。 |
![]() |
3
1
只是速记。 在第二个实例中,要声明将使用的结构,请执行以下操作:
在第一个变体中,您可以使用:
|
![]() |
4
0
第二种变体也存在于c中。 您可以在任何时候使用第一个变量来命名您的类型,例如:
|
![]() |
5
0
第一个可能在C++中是不方便的,因为您不能在头文件中声明它。 |
![]() |
Jersey · 如何在自己的定义中缩写类名? 7 年前 |
![]() |
Felix · 为什么我用typedef定义自然类型的尝试不起作用? 7 年前 |
![]() |
cppBeginner · 将“typedef”设为最终(或模拟) 7 年前 |
![]() |
coJetty · 使用或typedef减少模板参数 7 年前 |
![]() |
VannTen · 使用指向非结构类型的不透明指针 7 年前 |
|
John Smith · C中带有数组的Typedef 7 年前 |
![]() |
thndrwrks · 带有typedef ed函数指针的常量限定符 7 年前 |