【发布时间】:2010-12-05 08:22:24
【问题描述】:
我遇到过以下代码:
typedef struct {
double x;
double y;
double z;
} *vector;
这是一个有效的类型定义吗? 代码编译并运行良好。我只是好奇这是否是常见的做法。
【问题讨论】:
我遇到过以下代码:
typedef struct {
double x;
double y;
double z;
} *vector;
这是一个有效的类型定义吗? 代码编译并运行良好。我只是好奇这是否是常见的做法。
【问题讨论】:
绝对有效。 通常,您可以通过同时定义两种类型来充分利用这种方式:
typedef struct
{
int a;
int b;
} S1, *S1PTR;
其中 S1 是一个结构,S1PTR 是指向该结构的指针。
【讨论】:
const *S1CPTR。
typedef struct {...} S1; typedef S1* S1PTR;?
是的。但这是我认为不好的风格。不是结构的直接声明,而是指针类型的直接声明。这是混淆,当你想阅读代码时,给定变量或参数是一个指针(在较小程度上是数组)的信息是非常重要的。
在审查代码时,通常很难一眼看出哪个函数会产生副作用。如果使用的类型隐藏了这些信息,则会增加读者的记忆负担。
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 类型。
【讨论】:
typedef struct { ... } *obj 导致的类型神秘地需要 -> 而不是 . 进行元素访问。
是的,它是有效的。如果您需要更多“安全性”,您也可以这样做
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”的麻烦。
【讨论】: