Objective-C 学习笔记 12 预处理程序

来源:互联网 发布:ubuntu上安装mysql5.7 编辑:程序博客网 时间:2024/05/08 23:55

12.1 #define 语句

“#define TRUE 1
定义名称TRUE 使它等于值1。
gameOver = TRUE;
使用了预定义名称TRUE,指定值TRUE给gameOver。
预定义后面没有分号。给TRUE赋值也没有用等号。

,#define 语句很特别,经常放在程序开始的地方,#import 或者include之后,这并不是必须的,也可以放在程序的任何地方,但是在程序引用这个名称之前,必须先定义它们,预定义名称没有局部定义的说法,在定义一个名称之后,就可以在程序的任何地方使用它。
习惯上,程序员喜欢把大写字母作为常量名称这样更加容易区分,预定义名。或者在定义之前加上字母k。

12.1.2更高级的定义类型
预定义一个表达式,预定义本身也可以作为预定义的值。或者是一个字符。
,#define TWO_PI 2.0 * 3.14
,#define PI 3.14
,#define TWO_PI 2.0 * PI

如果预定义程序假设定义包含在程序的一行中,如果需要第二行,那么上一行的最后一个字符必须是反斜线符号。

if (year % 4 ==0 && year %100 != 0 || year % 400 ==0)

,#define IS_LEAP_YEAR year % 4 == 0 && year %100 != 0 \ ||year % 400 ==0

在执行带有参数的预定义时,预定义名称和参数列表的左括号之间不能有空格。
,#define ,#define IS_LEAP_YEAR(y) y % 4 == 0 && y % 100\ != 0 || y % 400 ==0
这里没有定义参数类型,所以只是执行字面上的替换。
按照前面的语句可以编写如下:
if ( IS_LEAP_YEAR(year) )

只要出现y,就用year来替换它。

在定义宏时,有一个有趣的陷阱。
,#define SQUARE(x) x * x
y = SQUARE(v);
把v * v 赋值给y ,如果是以下语句:
y = SQUARE(v + 1)
这样的语句并不会想期望的那样,把(v + 1)的平方赋值给y,因为预处理程序是对宏定义的参数实行文本替换,会得到以下求值:
y = v + 1 * v + 1;
要解决这个问题我们要在定义中加入括号:
,#define SQUARE(x) ( (x) * (x) )

条件编译

,#ifdef, #endif ,#else, #ifndef语句

0 0