目录
1.程序的翻译环境与执行环境
在ANSI C的任何一种实现中,存在两个不同的环境。
第一种是翻译环境,在这种环境中源代码转换为可执行的机器指令(二进制指令)。
第二种是执行环境,它用于实际执行代码。
翻译环境(通常指编译器)其实就是将源程序翻译为可执行程序,执行环境是用来执行代码的(通常指操作系统)。
1.1编译本身分为几个阶段:
如下图:
我们假设创建了两个源文件test.c与add.c下图前两行为在Linux系统下的指令。
2.预处理详解
2.1预定义符号
2.2define
2.2.1define定义标识符
语法:define name stuff
2.2.2#define定义宏
#define机制包括了一个规定,允许把参数替换到文本中,这种实现称为宏(macro)或定义宏(define macro)
下面是宏的申明方式:
#define name(parament-list)stuff,其中的parament-list是一个由逗号隔开的符号表,它们可能出现在stuff。
注意参数列表的左括号必须与name紧邻。如果两者之间有空白存在,参数列表就会解释为stuff的一部分。
如:
#define SQUARE(X) ((x)*(x))
2.2.3#defien 替换规则
2.2.4#和##
如何把参数插入到字符中?
首先我们看看这段代码
上面代码输出hello bit
hello bit
#include <stdio.h>
#define PRINT(n) printf(#n" is %d\n", n)
int main()
{
int a = 0;
int b = 1;PRINT(a);//打印结果a is 0
PRINT(b);//打印结果b is 1return 0;
}
##的作用
##可以把它两边的符号合并成一个符号。
它允许宏定义从分离的文本片段创建标识符
#define CAT(a,b) a##b
int main()
{
int input = 100;
printf("%d\n", CAT(in, put));//输出100return 0;
}
宏的优缺点
3.宏由于类型无关,也就不够严谨。
4.宏可能会带来运算符优先级的问题,导致程序出错。
文章评论