无参宏定义
无参宏的宏名后不带参数。
#define 标识符 字符串
define为宏定义命令。“标识符”为所定义的宏名(一般用大写字母)。“字符串”可以是常数、表达式、字符串等。
宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令
宏名在源程序中若用引号括起来,则预处理程序不对其作宏替换。
宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。
宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。
可用宏定义表示数据类型,使书写方便 如: #define INTEGER int
宏定义表示数据类型和typedef定义数据说明符的区别
宏定义只是简单的字符串代换,是在预处理时完成的,而tyoedef是在编译时处理的,它不是简单的代换,而是对数据说明符重新命名。被命名的标识符具有类型定义说明的功能。
对“输出格式”作宏定义,可以减少书写麻烦。
带参宏定义
#define 宏名(形参表) 字符串
调用: 宏名(实参);
1. 带参宏定义中,宏名和形参表之间不能有空格出现
2. 在带参宏定义中,形参不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值,要用它们去代换形参,因此必须做类型说明。
函数值传递 带参宏定义只是符号代换,不存在值传递
在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
#include<stdio.h>
#define SQ(y) (y)*(y)
void main()
{
int a, sq;
printf("input a number:");
scanf_s("%d", &a);
sq = SQ(a + 1); //sq= (a+1) * (a+1)
printf("sq=%d\n", sq);
system("pause");
}
#include<stdio.h>
#define SQ(y) y*y
void main()
{
int a, sq;
printf("input a number:");
scanf_s("%d", &a);
sq = SQ(a + 1); //sq= a+1 * a+1
printf("sq=%d\n", sq);
system("pause");
}
条件编译
#ifdef 标识符
程序段1
#else
程序段2
#endif
如果标识符已被#define命令定义过 则对程序段1进行编译;否则对程序段2进行编译。
或: #ifdef 标识符
程序段
#endif
#ifndef 标识符
程序段1
#else
程序段2
#endif
#ifdef 常量表达式
程序段1
#else
程序段2
#endif
文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。