目录
一、程序的翻译环境和执行环境
(一)编译的几个阶段
(二)运行环境
二、预定义符号
1. 举例
2. 举例
3. 补充
三、#define
(一) #define 定义标识符
1. #define MAX 1000
2. #define reg register (为resgister这个关键字,创建一个简短的名字)
3. #define do_forever for(;;) 用更形象的符号替换
4. #define CASE break;case
5. 续行符
6. 在define定义标识符的时候,要不要在最后加上 ;
(二)#defien定义宏
1. 基本概念
2. 利用宏求一个数的平方
3. 乘法运算先于宏定义的加法
4. 宏定义和函数定义返回较大值的比较
5. #define 替换规则
6. 注意
(三)#和##
1. 使用 # ,把一个宏参数变成对应的字符串
2. ## 的作用
(四)带副作用的宏参数
1. 举例1
2. 举例2
(五)宏和函数对比
1. 求两个数中的最大值(那为什么不用函数来完成这个任务)
2. 宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到
(六)命名约定
四、#undef
五、命令行定义
六、条件编译
1. #if 常量表达式 和#endif
2. 多个分支的条件编译
3. 判断是否被定义
程序执行的过程:
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
#include
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < 10; i++)
{
printf("%d----%s,%s,%s,line=%d\n", arr[i], __FILE__, __DATE__, __TIME__, __LINE__);
}
return 0;
}
语法:
#define name stuff
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ , \
__DATE__,__TIME__ )
#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
注意:
改进后:
#define Add(x) ((x)+(x))
#include
#define MAX(X,Y) ((X)>(Y)?(X):(Y))//宏的形式
int Max(int x, int y)//函数的形式
{
return x>y?x:y;
}
#define M 100
int main()
{
int m = MAX(M, 5);
printf("%d\n", m);
m = Max(3,5);
printf("%d\n", m);
return 0;
}
在程序中扩展#define定义符号和宏时,需要涉及几个步骤 :
字符串是有自动连接的特点的
#include
#define print_format(num, format) \
printf("the value of "#num" is "format, num)
int main()
{
int a = 10;
print_format(a, "%d\n");
//printf("the value of a is %d\n", a);
int b = 20;
print_format(b, "%d\n");
//printf("the value of b is %d\n", b);
float f = 3.14f;
print_format(f, "%f\n");
//printf("the value of f is %f\n", f);
return 0;
}
注意:这样的连接必须产生一个合法的标识符。否则其结果就是未定义的
//代码1
int a = 10;
int b = a+1;//b得到是11,a还是10
//代码2
int a = 10;
int b = ++a;//b得到了11,但是a也变了,变成了11
//代码2是有副作用的
#define _CRT_SECURE_NO_WARNINGS 1
#include
//函数的实现
int Max(int x, int y)
{
return x > y ? x : y;
}
//宏的实现
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d %d", &a, &b);
//较大值
int m1 = Max(a, b);
printf("%d\n", m1);
int m2 = MAX(a, b);
printf("%d\n", m2);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#define MALLOC(num,type) (type*)malloc(num*sizeof(type))
int main()
{
int* p = MALLOC(5, int);
//等价于int*p=(int*)malloc(5*sizeof(int));
return 0;
}
习惯性:
#if 常量表达式
//...
#elif 常量表达式
//...
#else
//...
#endif
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol