- 宏定义:c++宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以只定的字符串来代替。
带参数的宏定义的一般形式如下:#define <宏名>(<参数表>) <宏体>
<宏名>是一个标识符,<参数表>中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。<宏体>是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。
例如:#define SUB(a,b) a-b
如果在程序中出现如下语句:
result=SUB(2, 3); 则被替换为:result=2-3;
如果程序中出现如下语句:result= SUB(x+1, y+2); 则被替换为:result=x+1-y+2;
在这样的宏替换过程中,其实只是将参数表中的参数代入到宏体的表达式中去,上述例子中,即是将表达式中的a和b分别用2和3代入。
注意事项:
1)<宏名>和<宏体>直接用空格分开,而不是等号连接
- 在书写带参数的宏定义时,<宏名>与左括号之间不能出现空格,否则空格右边的部分都作为宏体。
例如:#define ADD (x,y) x+y
将会把"(x,y)x+y"的一个整体作为被定义的字符串。 - 使用#define定义的标识符不是变量,它只用作宏替换,因此不占有内存。
- 如果某一个标识符被定义为宏名后,在取消该宏定义之前,不允许重新对它进行宏定义。取消宏定义使用如下命令:#undef<标识符>(标识符一般以大写表示,从而与变量名进行区分)
- 宏定义可以嵌套,已被定义的标识符可以用来定义新的标识符。
例如:#define PI 3.14159265#define R 10#define AREA (PI*R*R) - 宏定义的参数尽量添加括号,以避免产生上述现象。
- 用预处理指令#define声明一个常数,用以表面1年中有多少秒(忽略闰年的情况)。
答案:#define SECONDS_PER_YEAR 60*60*24*365UL
注意:不能将
#define SECONDS_PER_YEAR 60*60*24*365UL 写成
#define SECONDS_PER_YEAR (60*60*24*365)UL在
编译GCC程序,提示这个错误 error: expected ‘,’ or ‘;’ before ‘UL’;是因为UL写在了括号外面,无法与数据进行匹配;