目录
一、程序环境
1.程序的翻译环境和执行环境
(1)翻译环境,在这个环境中源代码被转换为可执行的机器指令。
(C语言代码——>二进制指令(可执行的程序))
(2)执行环境,它用于实际执行代码。(执行二进制的代码)
2.编译
2.1翻译环境
vs2019集成开发环境:编译器(cl.exe) + 链接器(link.exe)+ 调试器
2.2编译阶段
2.3运行环境
程序执行的过程:
1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2. 程序的执行便开始。接着便调用main函数。
3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。
4. 终止程序。正常终止main函数;也有可能是意外终止。
二、预处理详解
1.预定义符号
__FILE__ // 进行编译的源文件__LINE__ // 文件当前的行号__DATE__ // 文件被编译的日期__TIME__ // 文件被编译的时间__STDC__ // 如果编译器遵循 ANSI C ,其值为 1 ,否则未定义(在vs中未定义,vs不支持)
这些预定义符号 都是语言内置的。
举个例子:
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("File:%s line=%d date:%s time:%s i=%d\n", __FILE__, __LINE__, __DATE__, __TIME__, i);
}
return 0;
}
2.#define
2.1#define定义标识符
语法: #define name stuff
举例:
#define MAX 100
#define CASE break;case
如果定义的stuff过长,可以分成几行写,除了最后一行,每行的后面都加上一个反斜杠(续行符)续行符后面直接加回车键,不能加别的东西,否则会显示错误!(空格也不行)
举个例子:
#define DEBUG_PRINT printf("file:%s\tline:%d\tdate:%s\ttime:%s\n",__FILE__,__LINE__ ,__DATE__,__TIME__ )
//改后
#define DEBUG_PRINT printf("file:%s\tline:%d\t\
date:%s\ttime:%s\n",\
__FILE__,__LINE__ ,\
__DATE__,__TIME__ )
那么有个问题,在#define定义标识符的时候,要不要在后面加上';'?
比如:
#define MAX 100;
#define MAX 100
建议不要加;,容易导致问题:
#include <stdio.h>
#define MAX 100;
int main()
{
int max = 0;
if (1)
max = MAX;
else
max = 0;
}
这里 如图所示,这里的 ; 会被认成一行语句,所以会报错
2.2#define定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义 宏(define macro)。
宏的申明方式:#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。
注意:<