程序环境和预处理

1. 翻译环境

在这个环境中源代码被转换为可执行的机器指令。

在符号表中只能看到全局的符号

编译阶段各源文件被独立编译生成目标文件(.o ),每个目标文件有自己符号表,链接阶段会将这些符号表合并汇总处理,以便解析符号引用等

2. 运行环境

它用于实际执行代码

程序执行的过程:

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。(点击一次exe文件就相当于载入内存,给小车下载代码也相当于载入内存)

  2. 程序的执行便开始。接着便调用main函数。

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

  4. 终止程序。正常终止main函数;也有可能是意外终止。

3. 预处理详解

这些预定义符号都是语言内置的

切记不要加分号

用于对数值表达式进行求值的宏定义都应该加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用

注意事项2:

##可以把位于它两边的符号合成一个符号。它允许宏定义从分离的文本片段创建标识符

注:

这样的连接必须产生一个合法的标识符。否则其结果就是未定义的

宏和函数对比:

宏通常被应用于执行简单的运算

比如在两个数中找出较大的一个:

一般功能简单的代码用宏定义,复杂的用函数包装

文件包含:

嵌套文件包含:

comm.h和comm.c是公共模块。

test1.h和test1.c使用了公共模块。

test2.h和test2.c使用了公共模块。

test.h和test.c使用了test1模块和test2模块。

这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。

如何解决这个问题那:

第二种就是直接在源文件的开头加入#pragma once

这算是我自己的笔记吧,还有命令行定义和条件编译我没写,想了解的参考《C语言深度解剖》学习

相关推荐
迎風吹頭髮24 分钟前
UNIX下C语言编程与实践22-UNIX 文件其他属性获取:stat 结构与 localtime 函数的使用
c语言·chrome·unix
迎風吹頭髮24 分钟前
UNIX下C语言编程与实践21-UNIX 文件访问权限控制:st_mode 与权限宏的解析与应用
c语言·数据库·unix
Archie_IT2 小时前
嵌入式八股文篇——P1 关键字篇
c语言·开发语言·单片机·mcu·物联网·面试·职场和发展
Rain_is_bad3 小时前
初识c语言————数学库函数
c语言·开发语言·算法
磨十三3 小时前
C++ 类型转换全面解析:从 C 风格到 C++ 风格
java·c语言·c++
智者知已应修善业5 小时前
【51单片机计时器1中断的60秒数码管倒计时】2023-1-23
c语言·经验分享·笔记·嵌入式硬件·算法·51单片机
为何创造硅基生物6 小时前
C语言结构体
c语言·windows·microsoft
迎風吹頭髮6 小时前
UNIX下C语言编程与实践18-UNIX 文件存储原理:目录、i 节点、数据块协同存储文件的过程
java·c语言·unix
范纹杉想快点毕业7 小时前
ZYNQ7045芯片中UART实现RS422通信详解,50000字解析,C语言,嵌入式开发,软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·fpga开发
Murphy_lx7 小时前
Linux(操作系统)文件系统--对打开文件的管理(C语言层面)
linux·服务器·c语言