我遇到过以下代码:
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类型.
是的,它是有效的。如果您需要更多“安全”,您也可以这样做
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 意味着您可以这样命名。否则它或多或少会是匿名的。