繁体   English   中英

指向结构体的C typedef

[英]C typedef of pointer to structure

我遇到了以下代码:

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

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

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

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

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

是的。 但这是恕我直言的坏风格。 不是直接声明结构,而是直接声明指针类型。 令人费解的是,当您要阅读代码时,给定变量或参数是指针(对于数组而言程度较小)的信息非常重要。

在查看代码时,通常通常乍一看很难看出哪个功能可能有副作用。 如果使用的类型隐藏了此信息,则将给读者增加回忆负担。

int do_fancy(vector a, vector b); 

要么

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

在第一种情况下,我很容易想到该函数可能会更改a或b的内容。 在第二次中,我被警告。

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

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

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

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

那么你可以同时使用

struct vector_ *var;
vector var;

但是不要忘记结尾的分号。

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

它是一种有效的方法,它定义了一种新类型。 正如@Alex所说,定义类型和指针类型将很有用。

您可以仅通过使用创建更多的指针

S1PTR ptr1, ptr2, ptr3, ...;  

代替

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

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

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

是的...省去了每次声明向量struct或指向它的指针时都要不断输入单词'struct'的麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM