一、程序的编译环境和执行环境
(1)、每一个程序的源文件都会通过编译过程转换为相应的目标代码。
(2)、每一个目标代码由链接器捆绑在一起,形成一个单一的可执行程序。
(3)、链接器同时也会引入标准库函数中被程序任意引用的库函数,而且还可以搜索程序员的个人程序库,将需要的函数也链接到程序之中。
编译分为几个阶段组成:
程序执行的过程:
(1)、程序必须载入到内存中。
(2)、函数的执行开始,接着就调用main()函数
(3)、开始执行程序代码。这时函数需要使用一个运行时堆栈,存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储在静态内存中的变量在程序执行的整个过程中就一直保留它们的值。
(4)、终止程序,可能正常终止main()函数,也可能异常终止。
二、预处理器详解
以上这些符号都是语言内置的,可以直接使用。
1、#define 定义标识符
eg:
define PPROV 100
define rigister rig//创建一个更短的名字
在define定义标识符的时候不要加上;很容易会导致错误。
2、#define 定义宏
define name(parament-list) stuff
parament-list使用,隔开的符号表,参数列表的左括号必须要与name紧挨,否则参数列表就会被解释为stuff中的一部分。
eg #define add(x) x+x
注意:在用于数值表达式求值的宏定义一定要加上括号,为了避免在使用宏时由于参数中的操作符和邻近操作符之间不可预料的相互作用。
define 替换
(1)、调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果有,应该首先替换。
(2)、替换文本后被插入带文本原来的位置,对于宏,函数名被他们替换。
(3)、最后,再次对结果文件进行扫描,看它是否包含由#define定义的符号。
3、#与##
使用#,可以将一个宏参数变成对应的字符串
#define PRINT(format,value)\
printf("the value of "#value" is "format"\n");
int i = 10;
int main()
{
PRINT("%d", i +3);
system("pause");
return 0;
}
#define CAT(x,y) x##y
int main()
{
int v9 = 10;
printf("%d\n", CAT(v, 9));
system("pause");
return 0;
}
4、宏和函数
宏和函数的优缺点:
5、条件编译
具体实现为:
#include <stdio.h>
#include <stdlib.h>
#define _DEGUG_ 0
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
arr[i] = i;
#ifdef _DEGUG_
printf("hehe\n");
#endif
}
system("pause");
return 0;
}
表示如果被定义了就执行其中的语句,如果没有定义就不执行
define DEGUG
ifdef DEGUG
printf(“hehe\n”);
#endif
如果条件为真则参加编译,如果条件为假就不参与编译
define DEBUG 1
if DEBUG
printf("hehe");
endif
避免头文件的重复使用
ifdef TEST_H
define TEST_H
//头文件的内容