UG/Open API语法-数据类型
- 数据类型
- struct-声明结构体变量
- union-声明联合数据类型
- enum-声明枚举类型
- 枚举与#define宏的区别
- typedef-用于给数据类型取别名(当然还有其他作用)
数据类型
UG/Open API编程接口是C语言的语法格式,因而,它支持C语言的标准数据类型,除此之外,UG/Open API大量使用了 类型定义,如struct(声明结构体变量)、enum(枚举类型)、union(联合数据类型)等 UG/Open API数据结构的命名规则是:_t——数据类型;_s——结构体类型;_u_t——共用体类型;_t_p——数据类型指针;_u_p_t——共用体类型指针。
如:
union UF_STYLER_value_u
{char *string;char **strings;int integer;int *integers;double real;double *reals;UF_UI_selection_p_t selection;UF_STYLER_notification_p_t notify;UF_UI_attachment_t attach;UF_UI_option_toggle_t option_toggle;
};
typedef union UF_STYLER_value_u UF_STYLER_value_t;
上面的数据类型UF_STYLER_value_u是定义的共用体数据类型,通过typedef union关键字把UF_STYLER_value_u数据类型定义成UF_STYLER_value_t别名,即通过UF_STYLER_value_u和UF_STYLER_value_t定义的数据类型都表示同一种类型。
UF_STYLER_value_t数据类型主要用在UF_STYLER_item_value_type_s数据类型中,作为它的成员,UF_STYLER_item_value_type_s表示定义的是结构体类型的数据,定义如下:
struct UF_STYLER_item_value_type_s
{int reason;const char *item_id;int subitem_index;int count;int item_atttr;int indicator;UF_STYLER_value_t value;
};
此外,在UG/Open API中,用来识别对象的数据类型是tag_t,是对象语柄,实际上,tag_t是无符号整数数据类型,在uf_defs.h中定义如下:
typedef unsigned int tag_t,*tag_p_t;
大多数情况下,数据类型都在相应的头文件中有说明,因此,对于在程序中使用到的数据类型,也应在程序开头将相应的头文件用#include包含进来。下面是获取当前显示模型句柄tag_t,并将其关闭的代码:
tag_t tModel;
tModel = UF_PART_ask_display_part ();
UF_PART_CLOSE( tModel , 1 , 1 );
struct-声明结构体变量
首先介绍一下什么是定义?什么是声明?它们有何区别?
什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字(即我们经常说的变量名或对象名)。但注意,这个名字一旦和这块内存匹配,它们就同生共死。一个变量或对象在一定区域(比如函数内,全局等)只能被定义一次,否则编译器会提醒你重复定义同一个变量或对象。
什么是声明:有两重含义,如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到的变量或对象是在别的地方定义的。声明可以出现多次。
第二重含义:告诉编译器,这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。比如你在图书馆用书占了个位子,但你本人并没坐在这儿。这种声明最典型的例子就是函数参数的声明,例如
void fun (int i , char c);
定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。
struct是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用。
平时我们要求函数的参数尽量不超过4个,如果函数的参数多于4个使用起来非常容易出错(包括每个参数的意义和顺序都容易弄错),效率也会降低(与具体CPU有关,ARM芯片对于超过4个参数的处理就很讲究,具体请参考相关资料)。这个时候,可以用结构体压缩参数个数。
在C++中struct和class关键字一般可以通用,只有一个很小的区别。struct的成员默认情况下属性是public的,而class成员却是private的。
union-声明联合数据类型
union关键字的用法与struct的用法非常类似。
union维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union中所有的数据成员共有一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。如:
union StateMachine
{char character;int number;char *str;double exp;
};
一个union只配置一个足够大的空间来容纳最大长度的数据成员,如上例,最大长度是double型态,所以StateMachine的空间大小就是double数据类型的大小。
在C++中,union的成员默认属性为public。union主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。
例子:用程序确认当前系统存储是大端模式还是小端模式,请写一个C函数,若处理器是Big_endian,则返回0;若是Little_endian,则返回1。
注:大端模式(Big_endian):字数据的高字节存储在低地址,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):字数据的高字节存储在高地址,而字数据的低字节则存放在低地址中。
对union型的成员的存取都是对该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址开始。
int checkSystem() //检查系统存储方式为大端模式还是小端模式
{union check{int i;char ch;}c; //联合体c在内存中占4字节c.i = 1; //变量i占4字节,但只有一个字节值为1,另外三个字节为0return (c.ch == 1);
}
enum-声明枚举类型
定义方法:
enum enum_type_name
{ENUM_CONST_1,ENUM_CONST_2,...ENUM_CONST_n
}enum_variable_name;
注意:enum_type_name是自定义的一种数据类型名,即enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name类型的变量enum_variable_name只能取值为花括号内的任何一个值,如果赋给该变量的值不在列表中,会报错。ENUM_CONST_1、ENUM_CONST_2、…、ENUM_CONST_n,这些成员就是我们平时所说的枚举常量(常量一般大写)。**enum变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,他们的值从0开始依次递增1.如分别用一个常数表示不同颜色:
enum color
{GREEN = 1,RED,BLUE,GREEN_RED = 10,GREEN_BLUE
}ColorVal;
其中各常量名代表的数值分别为:
GREEN = 1
RED = 2
BLUE = 3
GREEN_RED = 10
GREEN_BLUE = 11
枚举与#define宏的区别
- #define宏常量是在预编译阶段进行替换。枚举常量则是在编译的时候确定其值。
- 一般在编译器里,可以调试枚举常量,但不能调试宏常量。
- 枚举可以一次定义大量相关常量,而#define宏一次只能定义一个。
typedef-用于给数据类型取别名(当然还有其他作用)
typedef是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。
在实际项目中,为了方便,可能很多数据类型(尤其是结构体之类的自定义数据类型)需要我们重新取一个适用实际情况的别名。这时候typedef就可以帮助我们。如:
typedef struct student
{//code
}Stu_st,*Stu_pst;
//struct student stu1;和Stu_st stu1;没有区别
//struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;没有区别