C typedef指向结构的指针

35 c struct pointers typedef

我遇到过以下代码:

typedef struct {
        double x;
        double y;
        double z;
} *vector;
Run Code Online (Sandbox Code Playgroud)

这是一个有效的类型定义吗?代码编译并运行正常.如果这是常见做法,我只是好奇.

ale*_*xkr 55

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

typedef struct
{
 int a;
 int b;
} S1, *S1PTR;
Run Code Online (Sandbox Code Playgroud)

其中S1是结构,S1PTR是指向此结构的指针.


Pat*_*ter 25

是的.但它的风格很糟糕.不是结构的直接声明,而是直接声明指针类型.它是模糊处理,当您想要读取代码时,给定变量或参数是指针(以及数组的较小程度)的信息非常重要.

在查看代码时,通常很难看到哪个功能可能产生副作用.如果使用的类型隐藏了这些信息,则会给读者增加记忆负担.

int do_fancy(vector a, vector b); 
Run Code Online (Sandbox Code Playgroud)

要么

int do_fancy(vector *a, vector *b);
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我很容易错过该功能可能会改变a或b的内容.在第二个我警告.

当实际编写代码时,我也直接知道编写,a->x而不是编译器告诉我error: request for memberx'在某个结构或联合的东西中.

我知道,它看起来像个人品味的东西,但是使用了很多外部代码,我可以向你保证,当你不认识到间接级别的变量时,它会非常烦人.这也是我不喜欢C++引用的一个原因(在Java中它不是因为所有对象都是通过引用传递的,它是一致的)和Microsoft的LPCSTR类型.

  • +1的观察结果是`typedef struct {...}*obj`导致了一种神秘地需要` - >`而不是`.`来进行元素访问的类型. (6认同)
  • 严格的命名约定会告知用户 typedef 的类型,因此风格并不是很糟糕。然而,当使用不同的编码实践处理外部代码时,我明白你的观点, (2认同)

Tob*_*rre 5

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

typedef struct vector_{
        double x;
        double y;
        double z;
} *vector;
Run Code Online (Sandbox Code Playgroud)

那么你可以同时使用

struct vector_ *var;
vector var;
Run Code Online (Sandbox Code Playgroud)

但不要忘记结尾的分号。

仅使用 typedef 意味着您可以这样命名。否则它或多或少会是匿名的。