【C】程序的编译/链接/预处理详解(C语言内功,精炼,基础)

简介: 【C】程序的编译/链接/预处理详解(C语言内功,精炼,基础)
+关注继续查看

一.程序的翻译环境和执行环境

在ANSI C的任何一种实现中,存在两个不同的环境

  • 翻译环境,此过程中源代码转换为可执行的机器指令
  • 执行环境,它用于实际执行代码

image.png

二.编译和链接的过程

image.pngimage.png

三.编译的几个阶段

image.png
image.png

1.形成符号表的过程:

image.png
image.png

2.段表的合并和重定位随后进行链接: 

image.png

四.运行环境

程序执行的过程:


程序必须载入内存中。在有操作系统的环境中,这个操作一般由操作系统完成。在独立的环境中必须手工完成,也可能是通过可执行代码置入只读内存来完成。

程序的执行便开始,接着调用main函数

开始执行程序代码,这个时候程序将使用一个运行的堆栈,存储函数的局部变量和返回值。程序同时也可以用静态内存,存储在静态内存中的变量在程序的整个执行过程中一直保留它们的值

五.预定义符号

__FILE__       //进行编译的源文件

__LINE__      //文件当前的行号

__DATE__     //文件被编译的日期

__TIME__     //文件被编译的时间

__STDC__     //如果编译器遵循ANSI C,其值为1,否则未定义

image.png

六.define/undef

define的两个用法:


  •   定义符号(标识符)
  •   定义

undef:用于移除宏定义  

image.png

image.png

1.define定义符号时,语法要求:

image.png

  • 不要加上  ;
  • 一般情况下大写

 image.png

2.define定义宏时,语法要求:

image.png

  • 注意要加入括号,防止整体替换时次序发生变化
  • image.pngimage.png

七.#define替换规则

image.png

八.#和##的应用 

1.#作用:把一个宏的参数变成对应的字符串

image.png

2.##的作用: 可以把位于其两端的(分离片段)符号合成一个符号

image.png

九.带副作用(功能)的宏参数

image.png

十.宏与函数的对比

1.宏的优点:

          1.小型工作时反应速度更快


          2.不需要指定特定类型(宏是类型无关的)


2.宏的缺点:

         1,用一次,会在文本中插入一次代码


         2,无法调试


         3,与参数类型无关,不够严谨


         4,可能存在运算符优先级的问题


3.宏能做到而函数做不到的例子:  

image.png

4.宏和函数全面对比一览: 

image.png

十一.条件编译(预处理指令)

image.png

例如:

image.png

1.预处理指令和普通判断语句的区别:

  •  预处理指令在预处理阶段就将不要的代码删除
  • 后面都要跟一个endif收尾

2.常见的条件编译指令: 

  • 普通条件编译:if/endif

image.png

  • 多分支的条件编译:if/elif/else/endif
  • image.png
  • 判断是否被定义

           if defined(symbol)/ifdef symbol   if !defined(symbol)/ifndef symbol

image.png

  • 嵌套指令 
  • image.png

十二.文件包含过程

  • " " 查找两次
  • < >查找一次

image.png

1.例题: include"test.h"与include <test.h>有什么区别?

答:两者查找策略不同

十三.解决嵌套头文件包含问题

在进行大项目制作时,常常会出现如下情况:comm.h同时通过左右被重复包含,造成冗余

image.png

1.两种解决方案: 

  1. prama once(编译器创建头文件时有时候会默认加) 
  2. 条件编译

image.png

2.例题:头文件中的ifndef/define/endif是干什么用的?

答:防止头文件被重复包含

相关文章
|
3天前
|
C语言
C语言预处理及宏和函数的区别与各自优劣点的详解(下)
C语言预处理及宏和函数的区别与各自优劣点的详解(下)
|
3天前
|
C语言
C语言预处理及宏和函数的区别与各自优劣点的详解(上)
C语言预处理及宏和函数的区别与各自优劣点的详解(上)
|
18天前
|
Linux 编译器 C语言
C语言进阶-程序环境和预处理(2)
C语言进阶-程序环境和预处理
31 1
|
18天前
|
存储 自然语言处理 编译器
C语言进阶-程序环境和预处理(1)
C语言进阶-程序环境和预处理
30 0
|
20天前
|
编译器 Linux C语言
【C语言航路】第十五站:程序环境和预处理(下)
【C语言航路】第十五站:程序环境和预处理(上)
27 0
|
20天前
|
存储 自然语言处理 编译器
【C语言航路】第十五站:程序环境和预处理(上)
【C语言航路】第十五站:程序环境和预处理
23 0
|
21天前
|
编译器 C语言 C++
C语言 预处理详解
C语言 预处理详解
|
28天前
|
存储 程序员 编译器
C语言程序环境和预处理
C语言程序环境和预处理
13 0
|
2月前
|
存储 编译器 程序员
C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)
C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)
|
2月前
|
编译器 Linux C语言
C语言---预处理详解 2
C语言---预处理详解
13 0
相关产品
云迁移中心
推荐文章
更多