C编程语言教程-第4页
参考以下页面浏览完整的C教程。
C语言页面1
C语言页面2
C语言page3
C语言页面4
C语言页面5
宏定义
宏是一段有名字的代码片段。无论何时使用该名称,它都会被宏的内容所取代。
这个替换是由c预处理器完成的
有两种宏。它们的区别主要在于它们的外观和使用时间。
类对象宏在使用时类似于数据对象
类函数宏类似于函数调用
•宏用于替换重复的值或不能正常工作的代码片段;或者将它们转换为函数可能代价很高。
宏——类对象宏
类对象宏是一个简单的标识符,它将被代码片段所取代。它被称为类对象,因为它在使用它的代码中看起来像一个数据对象。它们最常用于给数值常量赋予符号名称。
定义一个名为BUFFER_SIZE的宏作为令牌1024的缩写。
•如果在“#define”指令之后出现了这样的C语句
foo = (char *) malloc (BUFFER_SIZE);
然后C预处理器将识别并扩展BUFFER_SIZE宏。C编译器将看到与您自己编写的相同的标记
Foo = (char *) malloc (1024);
•按照惯例,宏名要大写。如果能够一眼看出哪些名称是宏,程序就更容易阅读。
宏的主体在“#define”行结束。如果需要,可以使用反斜杠-换行符将定义延续到多行上。然而,当宏展开时,它将全部显示在一行中。
例如,
#定义数字1,\
2, \
3 int x[] = {NUMBERS};==> int x[] = {1,2,3};
记住,\的末尾不应该有任何空格
在多行中继续宏时。
C预处理器按顺序扫描程序。宏定义在您编写它们的地方生效。因此,以下输入到C预处理器
foo = X;
#定义X 4
bar = X;
生产
foo = X;Bar = 4;
在下面的程序中x的值是多少?
#定义BUFSIZE (1020)
#定义table (BUFSIZE)
# undef BUFSIZE
#定义BUFSIZE (37)
int主要(空白)
{
int x = TABLESIZE;
Printf ("x= %d\n");
}
宏——类似函数的宏
类似函数的宏可以带参数,就像真正的函数一样。若要定义使用参数的宏,请在宏定义中的圆括号对之间插入参数,从而使宏类似于函数。参数必须是有效的C标识符,用逗号和可选的空格分隔。
#定义最小值(X, Y) ((X) < (Y) ?(x): (y))
x = MIN(a, b);x = (a) < (b) ?(a):(b));
y = MIN(1,2);==> y = (1) < 2 ?(1):(2));
z = MIN(a + 28, *p);==> z = ((a + 28) < (*p) ?(a + 28):(*p));
宏连接
在展开宏时,将两个令牌合并为一个令牌通常很有用。这称为令牌粘贴或令牌连接。'##'预处理操作符执行令牌粘贴。当展开宏时,每个“##”操作符两侧的两个令牌被组合成一个令牌,然后取代宏展开中的“##”和两个原始令牌。
Typedef -定义和使用
一个类型定义声明允许您定义自己的标识符,可以用来代替int、float和double等类型说明符。类型定义声明不保留存储空间。使用typedef定义的名称不是新的数据类型,而是它们所表示的数据类型或数据类型组合的同义词。
当使用typedef标识符定义对象时,被定义对象的属性与通过显式列出与标识符关联的数据类型定义对象时完全相同。
这意味着typedef unsigned char uint8;uint8 abcd;和unsigned char abcd;都是一样的
Typedef允许用户定义他们想要的数据类型。
使用typedef可以使代码更容易阅读,也更容易移植到新机器上。但是没有创建新的物理数据类型。