1.程序的运行环境
程序执行的过程:
- 1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
- 2. 程序的执行便开始。接着便调用main函数。
- 3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。
- 4. 终止程序。正常终止main函数;也有可能是意外终止。
2.预编译详解
2.1预定义符号
C语言中为我们预定义了一些符号,这些预定义符号是语言内置的
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
可以验证一下:打印我们当前的文件
这些预定义符号都是在预处理阶段就处理的,那么预处理阶段是怎么处理的呢,我们切换到linux系统下进行观察
使用指令:
预处理 选项 gcc -E test.c -o test.i预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。
1 #include<stdio.h>
2
3 int main()
4 {
5 printf("%s\n",__FILE__);//打印一下当前文件所在的位置
6 printf("%d\n",__LINE__);//打印行号
7 return 0;
8 }
~
我们打开test.i发现:
预处理阶段将我们的预定义符号直接进行了替换
我们可以在来看一下其他几个预定义符号:
说明:当前的vs不支持标准c的,就是大部分支持但是没有完全实现
3.2 #define
3.2.1 #define 定义标识符
语法:#define name stuf
#define 可以预定义一个整型值,可以预定义一个字符串,甚至一段代码或者函数
在代码中用到宏定义的地方,在预处理阶段直接进行替换处理,我们先简单看一下使用例子:
甚至于,我们可以使用我们的预定义来帮我们简写代码,但是1可能可读性不高
#define CASE break;case
int main()
{
int d = 0;
switch (d)
{
case 1:
CASE 2 :
CASE 3:
}
return 0;
}
就不用很麻烦的在去写什么case break了,但是代码可读性不高
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\t line:%d\t date:%s\t time:%s\n",__FILE__,__LINE__,__DATE__,__TIME__)
问题:在define定义标识符的时候,要不要在最后加上 ; ?