【问题标题】:C typedef of pointer to structure指向结构的指针的 C typedef
【发布时间】:2010-12-05 08:22:24
【问题描述】:

我遇到过以下代码:

typedef struct {
        double x;
        double y;
        double z;
} *vector;

这是一个有效的类型定义吗? 代码编译并运行良好。我只是好奇这是否是常见的做法。

【问题讨论】:

    标签: c pointers struct typedef


    【解决方案1】:

    绝对有效。 通常,您可以通过同时定义两种类型来充分利用这种方式:

    typedef struct
    {
     int a;
     int b;
    } S1, *S1PTR;
    

    其中 S1 是一个结构,S1PTR 是指向该结构的指针。

    【讨论】:

    • ...也许还有const *S1CPTR
    • 只是为了确认我理解。是否等同于typedef struct {...} S1; typedef S1* S1PTR;
    【解决方案2】:

    是的。但这是我认为不好的风格。不是结构的直接声明,而是指针类型的直接声明。这是混淆,当你想阅读代码时,给定变量或参数是一个指针(在较小程度上是数组)的信息是非常重要的。

    在审查代码时,通常很难一眼看出哪个函数会产生副作用。如果使用的类型隐藏了这些信息,则会增加读者的记忆负担。

    int do_fancy(vector a, vector b); 
    

    int do_fancy(vector *a, vector *b);
    

    在第一种情况下,我很容易错过该函数可能会更改 a 或 b 的内容。在第二个我被警告了。

    在实际编写代码时,我也知道直接编写 a->x 而不是让编译器告诉我 error: request for member x' 不是结构或联合`。

    我知道,这看起来像是个人品味的事情,但是在处理过大量外部代码之后,我可以向您保证,当您无法识别变量的间接级别时,这会非常烦人。这也是我不喜欢 C++ 引用的原因之一 (在 Java 中不是因为所有对象都通过引用传递,而是一致的)和微软的 LPCSTR 类型。

    【讨论】:

    • +1 用于观察 typedef struct { ... } *obj 导致的类型神秘地需要 -> 而不是 . 进行元素访问。
    • 严格的命名约定会告知用户 typedef 的类型,所以不是很糟糕的风格。但是,在使用不同的编码实践处理外部代码时,我明白了你的观点,
    【解决方案3】:

    是的,它是有效的。如果您需要更多“安全性”,您也可以这样做

    typedef struct vector_{
            double x;
            double y;
            double z;
    } *vector;
    

    那么你可以同时使用

    struct vector_ *var;
    vector var;
    

    但不要忘记结尾的分号。

    仅使用 typedef 意味着您以这种方式命名。否则它或多或少是匿名的。

    【讨论】:

    • 我相信您可以为两者使用相同的名称(即,您不需要下划线,但可以将代码中的其他所有内容保持不变,因为命名空间是分开的)。
    【解决方案4】:

    它是一个有效的,它所做的是它定义了一个新类型。正如@Alex 所说,定义类型和指针类型会很有用。

    你可以通过使用来创建更多的指针

    S1PTR ptr1, ptr2, ptr3, ...;  
    

    而不是

    S1 *ptr1, *ptr2, *ptr3, ...;
    

    【讨论】:

      【解决方案5】:

      是的,如上述答案所述,它是有效的。一个小建议,如果你也提供一个标签名称会更好,如下所示。这将有助于一些 IDE 更好地解析您的代码。

      typedef struct vactor_tag {
              double x;
              double y;
              double z;
      } *vector;
      

      【讨论】:

        【解决方案6】:

        是的...省去了每次声明向量结构或指向它的指针时不断输入单词“struct”的麻烦。

        【讨论】:

        • 我认为这个问题必须更多地处理 typedef 到 *vector 而不仅仅是矢量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-03
        • 2021-07-14
        相关资源
        最近更新 更多