文章目录
1.程序的翻译环境与执行环境图解
2. 预处理详解
1.预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
2.#define
1. #define 定义标识符
#define MAX 1000
#define reg register //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case 在写case语句的时候自动把 break写上
2.#define 定义宏
#include <stdio.h>
#define mul(x) x*x
int main()
{
int x = 5;
printf("%d", mul(x +1));
return 0;
}
- 结果不是36,而是11,因为会将表达式直接替换,并不是计算好x+1再传入到宏体
3.#与##
#define PRINT(a) printf("the value of " #a " is %d\n",a)
int main()
{
int a = 10;
int b = 20;
int c = 30;
PRINT(a);
PRINT(b);
PRINT(c);
return 0;
}
- #的作用是 把一个宏参数变成对应的字符串
#define ADD(num,value) \
sum##num += value
int main()
{
int sum5 = 0;
ADD(5,10);
printf("%d", sum5);
return 0;
}
##的作用是将两边符号合成一个符号
4. 宏与函数的对比
宏的优点 :
- 宏与函数比,宏比函数少了函数栈帧的维护,函数传参,函数返回值的返回,函数栈帧的销毁等等步骤,所以在运行效率上比函数快
- 函数的参数必须是特定类型,而宏与类型无关
宏的缺点 : - 除非宏比较短,否则替换时会加大代码的长度,特别是多次用到宏时,那么会影响代码执行效率
- 宏无法调试
- 宏没有类型,不够严谨
- 宏可能带来运算符优先级的问题
3.undef
- 移除宏的定义
防止头文件的被重复包含
#ifndefine
#define
头文件内容
#enif
或者
#pragma once