结构中的结构与作为周围结构一部分的命名匿名结构之间有什么区别?

问题描述 投票:0回答:3

例子:

#include <stdio.h>

struct not_inner {
    int a;
    int b;
};

struct outer {
    struct {
        int a;
        int b;
    } x;
    
    struct not_inner y;
};

int main()
{
    struct outer O = {1, 2, 3, 4};
    //x.a = 5;
    

    printf("%d %d %d %d", O.x.a, O.x.b, O.y.a, O.y.b);

    return 0;
}

主要是,我对 x 和 y 之间的区别感兴趣:

  • c99 标准
  • 访问速度
  • 范围
c struct declaration
3个回答
1
投票

范围:

x
y
仅作为
struct outer
对象的成员存在。

struct outer
struct not_inner
的范围是翻译单元(.c 文件)。

[C99 §6.7.2.1¶7] struct-or-union-specifier 中存在的 struct-declaration-list 声明了翻译单元中的新类型。 [...]


速度:

类型在运行时不存在。

O.x.a
O.y.a
都直接访问成员。所以申报的细节对速度没有影响。即使有,您也不会在标准中找到它。


0
投票

结构中的结构与作为周围结构一部分的命名匿名结构有什么区别?

[N]amed anonymous struct”是一个奇怪的短语,但我认为你是指

x
的成员
struct outer
。我会称其为未标记结构类型的成员。它绝对不是 anonymous struct —— 具有特定的、更自然的含义和不同的意义。

主要是我对x和y有什么区别感兴趣 关于:

  • c99 标准

两种形式都同样符合 C99 和 C 的所有后续版本。

  • 访问速度

没有理由认为是否标记结构类型会导致访问速度有任何差异。结构标记没有运行时表示。

  • 范围

除非它有

typedef
别名,否则不能在它出现的声明之外引用未标记的结构类型。但这不会影响对任何声明为该类型的对象的访问,也不会影响对其成员的访问,也不会阻止声明 compatible 类型。你可以用你的
outer.x
做任何你可以用你的
outer.y
做的事情,但是你可能想做的一些事情需要更多的
x
代码。

请注意,您为

x
呈现的特定形式有点不寻常(尽管肯定不是未知的),但这些方面的变化相对常见:

typedef struct {
    int a;
    int b;
} untagged_struct;

struct outer2 {
    untagged_struct x;
    
    struct not_inner y;
};

outer2.x
的类型也是untagged结构类型。拥有该类型的
typedef
别名基本上解决了所有可能使
outer.x
上的某些操作比
outer.y
上的类似操作需要更多代码的问题。

然而,就风格而言,我个人更喜欢避免使用

typedef
,特别是对于结构类型。我宁愿写(和看)
struct my_struct
而不是
my_struct
或类似的东西。


0
投票

C中没有“命名匿名结构”这样的概念

匿名结构的运动定义如下(6.7.2.1结构和联合说明符)

13 没有标签的结构类型的未命名成员称为 匿名结构;

在你的程序中没有匿名结构。

结构内

struct outer

struct outer {
    struct {
        int a;
        int b;
    } x;
    
    struct not_inner y;
};

声明了一个未命名结构的数据成员(没有结构标签名称)。因此,与结构

struct not_inner
相反,您不能引用未命名的结构说明符。

标签名称

outer
not_inner
具有文件范围。

无名结构和结构体访问数据成员的速度没有区别

not_inner
.

© www.soinside.com 2019 - 2024. All rights reserved.