我正在学习struct
和typedef
,我对编码很新。
typedef struct
{
uint8_t ID;
uint8_t TanID;
uint8_t ProductID;
uint8_t SetlTme;
uint8_t NoOfStep
}product_Config;
typedef product_Config *product_Config_Ptr;
我没有得到最后一行的意思
typedef product_Config *product_Config_Ptr;
答案 0 :(得分:3)
typedef
定义了类型的别名。
在您的示例中typedef Tank_Config *Tank_Config_Ptr;
将Tank_Config_Ptr
声明为Tank_Config *
的别名。
因此以下定义是等效的。
Tank_Config *ptr1;
Tank_Config_Ptr ptr2;
话虽如此,将指针隐藏在typedef
内部被认为是不好的做法。它掩盖了使用指针的事实,并且可能导致代码读者混淆。
答案 1 :(得分:2)
typedef
用于定义新的数据类型。这些新数据类型通常只是现有数据类型,结构或联合的别名。它主要用于定义在代码上下文中更有意义的类型。例如,size_t
是C中的标准类型,可以像这样定义(实际定义可能会因chqrlie在评论中指出的不同平台和实现而有所不同)
typedef unsigned int size_t;
因此,当您需要一个表示某个对象的大小或长度的变量时,您将其声明为size_t
的类型,这使得变量的意图更清晰。
使用typedef
的简化形式如下
typedef <some existing datatype or struct> <your_new_type>
(但它可能比这更复杂,并不总是适合这种形式。例如,如果你试图键入一个函数指针)
在你的例子中:
typedef Tank_Config *Tank_Config_Ptr;
您说Tank_Config_Ptr
是一种新类型,它是Tank_Config *
答案 2 :(得分:1)
这是一个typedef;它允许程序员在后续代码中用 <asp:CompareValidator
..........
..........
ControlToValidate="ddlStartYear"
ControlToCompare="ddlEndYear"
Operator="GreaterThanEqual"
Type="Integer">
</asp:CompareValidator>
代替Tank_Config_Ptr
,假设已将Tank_Config *
定义为类型。
这样的名字几乎没有什么好处,除非你有一些困难,难以编写或阅读Tank_Config
字符。
在第一个示例中,它允许*
代替product_Config
。这是件好事。
答案 3 :(得分:1)
使用typedef定义指针类型的最大优点可能是它允许在声明中为多个变量指定一个公共类型。如果想要一个指向Tank_Config的两个指针并且没有指针的typedef,那么就要写一个:
Tank_Config *first, *last;
或者
Tank_Config *first;
Tank_Config *last;
必须在每个变量名称前包含星号,而不是能够使用:
Tank_Config_Ptr first, last;
无需指定星号。一个相关的优点是它避免了与初始化器的语法不一致。如果foo()是一个返回Tank_Config的函数,则包含初始值设定项的指针声明如下:
Tank_Config *myPointer = foo(); // Note the asterisk is needed here...
但后续作业如下:
myPointer = foo(); // ...but not here!
如果使用type typedef形式,代码将如下所示:
Tank_Config_Ptr myPointer = foo(); // No asterisk here or in assignment
使用与后续分配相同的语法。
答案 4 :(得分:0)
接下来的两个字符串也是如此:
2016 - column['age']
Tank_Config * tank_config_ptr;