C 语言类型定义简介

目录汇总:C 语言零基础入门教程

C 语言 if 语句简介 中,我们使用 #define 指令创建了一个宏,可以用来定义布尔型数据:

1
#define BOOL int

但是,一个更好的设置布尔类型的方法是利用所谓的类型定义(type definition)特性:

1
typedef int Bool;

注意,Bool 是新类型的名字。还要注意,我们使用首字母大写的单词 Bool。将类型名的首字母大写不是必需的,只是一些 C 语言程序员的习惯。

采用 typedef 定义 Bool 会导致编译器在它所识别的类型名列表中加入 Bool。现在,Bool 类型可以和内置的类型名一样用于变量声明、强制类型转换表达式和其他地方了。例如,可以使用 Bool 声明变量:

1
Bool flag;    /* same as int flag; */

编译器将把 Bool 类型看成是 int 类型的同义词;因此,变量 flag 实际就是一个普通的 int 类型变量。

一、类型定义的优点

类型定义使程序更加易于理解(假定程序员仔细选择了有意义的类型名)。例如,假设变量 cash_in 和变量 cash_out 将用于存储美元数量。把 Dollars 声明成

1
typedef float Dollars;

并且随后写出

1
Dollars cash_in, cash_out;

这样的写法比下面的写法更有实际意义:

1
float cash_in, cash_out;

类型定义还可以使程序更容易修改。如果稍后决定 Dollars 实际应该定义为 double 类型,那么只需要改变类型定义就足够了:

1
typedef double Dollars;

Dollars 变量的声明不需要改变。如果不使用类型定义,则需要找到所有用于存储美元数量的 float 类型变量(这显然不是件容易的工作),并且改变它们的声明。

二、类型定义和可移植性

类型定义是编写可移植程序的一种重要工具。程序从一台计算机移动到另一台计算机可能引发的问题之一就是不同计算机上的类型取值范围可能不同。如果 iint 类型的变量,那么赋值语句

1
i = 100000;

在使用 32 位整数的机器上是没问题的,但是在使用 16 位整数的机器上就会出错。

可移植性技巧 为了更大的可移植性,可以考虑使用 typedef 定义新的整数类型名。

假设编写的程序需要用变量来存储产品数量,取值范围在 0~50 000。为此可以使用 long int 类型的变量(因为这样保证可以存储至少在 2 147 483 647 以内的数),但是用户更愿意使用 int 类型的变量,因为算术运算时 int 类型值比 long int 类型值运算速度快;同时,int 类型变量占用的空间较少。

我们可以定义自己的“数量”类型,而避免使用 int 类型声明数量变量:

1
typedef int Quantity;

并且使用这种类型来声明变量:

1
Quantity q;

当把程序转到使用较短整数的机器上时,需要改变 Quantity 的定义:

1
typedef long Quantity;

可惜的是,这种技术无法解决所有的问题,因为 Quantity 定义的变化可能会影响 Quantity 类型变量的使用方式。我们至少需要改动使用了 Quantity 类型变量的 printf 函数调用和 scanf 函数调用,用转换说明 %ld 替换 %d

C 语言库自身使用 typedef 为那些可能因 C 语言实现的不同而不同的类型创建类型名。这些类型的名字经常以 _t 结尾,比如 ptrdiff_tsize_twchar_t。这些类型的精确定义不尽相同,下面是一些常见的例子:

1
2
3
typedef long int ptrdiff_t;
typedef unsigned long int size_t;
typedef int wchar_t;

在 C99 中,<stdint.h> 头使用 typedef 定义占用特定位数的整数类型名。例如,int32_t 是恰好占用 32 位的有符号整型。这是一种有效的定义方式,能使程序更易于移植。

请参阅

(完)

comments powered by Disqus