我遇到过以下代码:
typedef struct {
double x;
double y;
double z;
} *vector;
这是一个有效的类型定义吗?代码编译并运行正常。如果这是常见做法,我只是好奇。
答案 0 :(得分:54)
绝对有效。 通常,您可以通过一起定义两种类型来充分利用这种方式:
typedef struct
{
int a;
int b;
} S1, *S1PTR;
其中S1是结构,S1PTR是指向此结构的指针。
答案 1 :(得分:25)
是的。但它的风格很糟糕。不是结构的直接声明,而是直接声明指针类型。它是混淆,当你想要读取代码时,给定变量或参数是指针(以及数组的较小程度)的信息是极其重要的。
在查看代码时,通常很难看到哪些功能可能会产生副作用。如果使用的类型隐藏了这些信息,则会给读者增加记忆负担。
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中,并不是因为所有对象都是通过引用传递的,它是一致的)和Microsoft的LPCSTR
类型。
答案 2 :(得分:3)
是的,它是有效的。如果您需要更多“安全性”,您也可以
typedef struct vector_{
double x;
double y;
double z;
} *vector;
然后你可以同时使用
struct vector_ *var;
vector var;
但不要忘记结束分号。
仅使用typedef意味着您可以这样命名。否则它或多或少都是匿名的。
答案 3 :(得分:2)
它是有效的,它的作用是定义一种新类型。正如@Alex所说,定义类型和指针类型会很有用。
您可以使用
创建更多指针S1PTR ptr1, ptr2, ptr3, ...;
而不是
S1 *ptr1, *ptr2, *ptr3, ...;
答案 4 :(得分:1)
是的,它有效,如上面的答案所述。一个小小的建议,如果您提供标签名称也会更好,如下所示。这将有助于某些IDE更好地解析您的代码。
typedef struct vactor_tag {
double x;
double y;
double z;
} *vector;
答案 5 :(得分:-2)
是的......每次声明向量结构或指向它的指针时,都可以省去不断输入'struct'这个词的麻烦。