【问题标题】:Difference in declaring structures声明结构的差异
【发布时间】:2009-06-11 04:01:39
【问题描述】:

我正在使用这样的结构。我不喜欢 typedef,因为我告诉过它可以隐藏错误。 但是,我正在查看一些示例代码,并且看到了这样声明的结构。这是我声明它们的正常方式。

struct person
{
     int age;
     char name[32];
};

这样使用:

    struct person person_a;
    person_a.age = 20;
    etc.

但是,我见过这样声明的结构:

struct 
{
     int age;
     char name[32];
}person;

struct _person
{
     int age;
     char name[32];
}person;

所有这些不同的技术之间有什么区别,您将如何决定何时最好使用每种特定的技术。

非常感谢您的任何建议,

【问题讨论】:

  • 我很想知道为什么 typedef 可以隐藏错误。我更喜欢 typedefs - 尤其是因为你不会遇到使用 'extern void func(struct something *xxx);' 的问题没有事先声明'struct something'。也就是说,'extern void func(something *xxx);'完全需要'something'的typedef才能编译。替代方案编译 - 但不符合您的预期(尽管总的来说,您会侥幸成功)。

标签: c struct


【解决方案1】:

这个:

struct 
{
    int age;
    char name[32];
}person;

声明一个变量person,即structstruct 没有名称,但您仍然以相同的方式使用 person 变量。

struct _person
{
    int age;
    char name[32];
}person;

这等同于:

struct _person
{
    int age;
    char name[32];
};
struct _person person;

它声明了一个名为_personstruct,然后创建了一个名为person 的变量struct _person

【讨论】:

    【解决方案2】:

    在最后两个结构中,您都为名为 person 的结构分配了存储空间。

    我的意思是如果你有这样的东西:

    struct person
    {
         int age;
         char name[32];
    };
    

    这只是一个声明;没有变量分配,因此不能在代码中使用。声明如下后就可以开始使用这个结构了:

    struct person p1;
    

    那么p1就可以用p1.age或者p1.name等了

    就真实世界的代码而言,而不是

    struct _person
    {
         int age;
         char name[32];
    }person;
    

    我们经常看到

    typedef struct _person
    {
         int age;
         char name[32];
    } person_t;
    

    在这种情况下,我们可以节省输入,更重要的是,该结构的行为类似于任何其他内置类型,例如 int 等。 例如,

    person_t p1;

    person_t *p1;

    等等。

    【讨论】:

      【解决方案3】:

      对于第一种情况(第二个示例),如果您确定您确实需要另一个对象用于此结构,您将使用此方法。这看起来很干净并且编码速度很快:)

      对于第二种情况,您有一个名为“person”的现成对象和一个稍后创建对象的选项

       struct _person object2
      

      这是为了解释为什么你会使用这两种方法。上面已经对它们之间的区别进行了很好的解释。

      【讨论】:

        【解决方案4】:

        真的没有魔法,

        struct person
        {
             int age;
             char name[32];
        } var;
        

        与以下内容相同:

        struct person
        {
             int age;
             char name[32];
        };
        struct person var;
        

        【讨论】:

          【解决方案5】:

          第一个代码只是创建了 person 结构。
          第二段代码创建了一个名为 person_a 的 person 结构实例。
          第三个代码创建了一个未命名的结构和一个名为 person 的实例。 第 4 段代码创建了一个名为 _person 的结构和一个名为 person 的实例。

          【讨论】:

            【解决方案6】:

            如果结构定义的目的是声明一个在本地模块之外有意义的逻辑数据结构,那么您会期望在头文件中看到第一个结构。

            在现实世界的 C 代码中,通常出于纯粹的实用原因在范围内声明结构。例如,格式化将被复制到缓冲区中的数据。在这些情况下,合并结构类型和变量声明非常方便且合乎逻辑。此外,对结构类型使用匿名声明可以避免使用不需要的名称来混淆命名空间。

            我确实对这些示例有一个批评:在 C 中,按照惯例,带有前导下划线的名称被认为是为编译器供应商保留的。所以我不认为最后一个例子符合最佳实践。

            【讨论】:

              猜你喜欢
              • 2013-05-28
              • 1970-01-01
              • 1970-01-01
              • 2017-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-25
              • 2020-06-15
              相关资源
              最近更新 更多