预处理

无参宏定义

无参宏的宏名后不带参数。

#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

文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。

猜你喜欢

转载自my.oschina.net/u/3749576/blog/1622174