宏定义命令 #define 用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序

中每次遇到该标识符时就用所定义的字符串替换它,其作用相当于给置顶的字符串起一个别名。

  不带参数的宏定义一般格式如下:

#define 宏名 字符串

1> “#”表示这是一条预处理命令

2>“宏名”是一个标识符,必须符合C语言标识符的规定

3>“字符串”在此可以是常数、表达式、格式字符串等

例如:

#define PI 3.14159

其作用是在该程序中用PI替代3.14159,在编译预处理时,每当在源程序中遇到PI就自动用3.14159

代替。

  使用#define进行宏定义的好处是需要改变一个常量的时候只需要改变#define命令行,整个程序的常

量都会改变,大大提高了程序的灵活性。

  宏名要简单且意义明确,一般习惯用大写字母表示,以便与变量名相区别。

  注意:宏定义不是C语句,不需要在行末加分号。

  宏名定义后,即可成为其他宏名定义中的一部分。例如,下面代码定义了正方形的边长SIDE、周

长PERIMETER及面积AREA的值。

#define SIDE 5
#define PERIMETER 4*SIDE
#define AREA SIDE*SIDE

  前面强调过宏替换是以串代替标识符,这一点要牢记。因此,如果希望定义一个标准的邀请语,

可编写如下代码。

 

#define STANDARD "You are welcome to join us."
printf(STANDARD);

编译程序遇到标识符STANDARD时,就会用"You are welcome to join us."替换。

对于编译程序,printf()语句如下形式是等效的。

printf("You are welcome to join us.");

对于不带参数的宏定义有以下几点要强调一下:

1、如果在串中含有宏名,则不进行替换。

  例如:

#include <stdio.h>

#define TEST "this is an example"

int main(void) {

char exp[30] = "This TEST is not that TEST";

printf("%s\n", exp);



return 0;
}

该段代码的输入结果如下:

This TEST is not that TEST

注意上面程序字符串中的TEST并没有用"this is an example"来替换,所以说如果串中含有宏名,

则不进行替换。

2、如果串长于一行,可以在该行末尾用一反斜杠“\”续行。

3、#define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到此源文件结束。

注意:在编写程序时通常将所有的#define放到文件的开始处或独立的文件中,而不是将它们分散到

整个程序中。

4、可以用#undef命令终止宏定义的作用域。

例如以下程序

#include <stdio.h>

#define TEST "this is an example"

int main(void) {


printf(TEST);


return 0;
}

程序输出为:

this is an example

修改程序为:

#include <stdio.h>

#define TEST "this is an example"

int main(void) {



printf(TEST);
#undef TEST

printf(TEST);



return 0;
}

使用#undef,然后再打印 TEST,会报错

Compilation Failed


/usercode/file.cpp: In function ‘int main()’:
/usercode/file.cpp:12:15: error: ‘TEST’ was not declared in this scope
printf(TEST);

显示TEST未定义。