程序的两种环境
任何c语言程序都需要经过两种不同的环境才能实现 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码 源文件经过编译器编译生成各自的目标文件,在经过链接器链接生成可执行程序。
编译环境-----》细分编译和链接阶段
执行环境
已经生成可执行程序(.exe) 程序执行的过程:
- 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序
的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。 - 程序的执行便开始。接着便调用main函数。
- 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回
地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。 - 终止程序。正常终止main函数;也有可能是意外终止。
预处理阶段详解
1预定义符号 FILE //进行编译的源文件 LINE //文件当前的行号 DATE //文件被编译的日期 TIME //文件被编译的时间 STDC //如果编译器遵循ANSI C,其值为1,否则未定义
2#define定义的标识符 ----原样替换的规则
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
- 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先
被替换。 - 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值替换。
- 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上
述处理过程。
宏和函数的对比 命名约定 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是: 把宏名全部大写 函数名不要全部大写
条件编译
int main()
{
#if 1
printf("hehe\n");
return 0;
#endif
#if 0
printf("haha\n");
#endif
return 0;
}
int main()
{
#ifndef M
printf("hehe\n");
#endif
return 0;
}
头文件包含的区别 ” “和<>
查找策略的不同: ” “现在源文件所在目录(当前工程)中查找,找不到再去库目录中查找 <>指针库目录下查找
防止头文件被重复引用
1#pragma once 2头文件中的 ifndef/define/endif
|