C语言复习:1.程序环境和预处理

C语言复习:1.程序环境和预处理

  • 程序环境
    • 翻译环境
    • 执行环境
  • 翻译环境详解
    • 预处理
    • 编译
    • 汇编
    • 链接
  • 宏与函数的详细对比
  • 条件编译

程序环境

翻译环境

翻译时,要进行一系列操作,将代码这种高级语言转换为二进制语言。

执行环境

程序必须要加载到内存中,才能运行,在有操作系统的情况下,操作系统会将程序加载到内存中。

翻译环境详解

预处理

在预处理阶段时,主要进行文本操作,如将头文件中的内容拷贝到文件中,将预处理指令替换,删除注释等等

编译

编译阶段要将代码转换为汇编代码,需要进行以下步骤:词法分析,语法分析,语义分析,符号汇总

汇编

汇编阶段主要将汇编代码转换为二进制代码,同时要为每个.c文件生成符号表和.obj文件,那么符号表中有什么呢?
如图:
C语言复习:1.程序环境和预处理_第1张图片

在编译阶段,存在符号汇总步骤,是将每个.c文件内的全局符号的地址汇总起来,在汇编阶段为每个.c文件生成一个符号表,要注意的是,符号表中的地址不一定是正确的(上图中,main.c与sum.c都有sum符号,但是只有sum.c中的sum符号的地址是正确的),所以在链接阶段多个.c文件生成的符号表会被合并和重定义,确定一个正确的符号表。

链接

链接阶段进行合并段表和符号表的合并和重定义,同时将多个.obj文件,链接库与链接器链接,生成.exe文件
大致过程如图:
C语言复习:1.程序环境和预处理_第2张图片

宏与函数的详细对比

是由#define预处理指令定义的符号,在预处理阶段会被完全替换
函数存在相同之处,那么宏与函数具体对比如何呢?
1.运行速度:宏>函数,因为函数需要开辟栈帧…一系列操作,花费更长时间
2.灵活度:宏>函数,函数的参数不能是类型,而宏的参数可以是某种数据类型
3.调试:宏不能调试,函数可以调试,因为宏在预处理阶段就被替换了,而调试是在生成.exe文件后开始调试
4.递归:宏不能递归,函数可以递归
5.参数问题:对于宏来说,传入带有副作用的参数会导致无法预料的错误,但是对于函数来说,在进入函数体时,带有副作用的参数就被计算完成了。
6.与其他操作符结合问题:宏时完全替换的原则,所以在表达式求值的环境中,如果对于宏体的变量不加括号,则会发生无法预料的错误,参数进入函数体内求值完成后才会进行其他操作

条件编译

条件编译:及在某些条件下,才会执行某些代码
条件编译有几个预处理指令,#if,#ifdef,#ifndef,#endif。
#if + 常量表达式,如果表达式为真,则进行下面代码的执行。
#ifdef + #define定义的符号,如果符号被定义,则执行下面的代码。
#ifndef,与#ifdef相反。
#endif,与#if成对出现,结束条件编译。

关于条件编译的题目
**#ifndef #define #endif 的作用:**防止头文件被多次包含

你可能感兴趣的:(c语言,开发语言)