IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言程序环境和处理 -> 正文阅读

[C++知识库]c语言程序环境和处理

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

翻译环境:源代码转换为可执行的机器指令

执行环境:代码的实际执行

二.详解编译加链接

如图为.c文件在编译和链接过程中如何变成.exe文件的粗略过程。

1.预处理阶段

会进行文本操作,比如将头文件内的内容全部包含显现;完成#define标识符标识的常量的替换,并且删除定义的符号;删除相关注释等。

2.编译过程

自动生成test.s文件,根据语法分析、词法分析、符号汇总、语义分析等把c语言代码转换成汇编代码

3.汇编

自动生成test.o文件,汇编代码转换成二进制指令,形成符号表(全局变量名称、函数名称视为符号,记录符号名称和符号地址

4.链接?

合并段表(以Linux环境为例,.o文件、.exe文件都是elf格式即如下图所示),符号表的合并和重定位(合并相同的符号名称并且取其有效地址)

三.预定义符号

?__FILE__? 表示进行编译的源代码文件的绝对路径

__LINE__??表示进行编译的源代码文件的行数

__DATE__ 表示进行编译的源代码文件的日期

__TIME__ 表示进行编译的源代码文件的时间

__STDC__ 如果编译器遵循ANSI C,则其值为1

VS编译器并不遵循ANSI C。

四.执行环境

1.程序的载入

载入形式:a.操作系统自动载入

b.程序员手工安排载入

c.可执行代码置入只读内存的形式载入

2.程序的执行

从main函数进入整个程序

3.执行程序代码

涉及到函数栈帧的知识,之后的博客会更新相关内容

4.终止程序

五.#define

1.#define标识符后并不加;

2.#define定义宏

形式: #define 宏名(参数名) 表达式

注意:参数名左括号紧贴宏名,表达式中参数要加括号,整体也要加括号

?3.#define替换规则:在预处理阶段,#define定义的常量、宏、标识符等完成替换,并且要删除原先定义的符号、常量或者宏。

4.# 和 ##

#N 将参数N转换为"N"

N##M 将N和M合并成一个合法的符号

?

#和##都只在#define定义的语句中使用。

5.带副作用的宏参数

参数中如果出现类似a++这样的参数,结果是难以预料的。?

6.宏和函数对比

宏:宏的使用导致代码长度大幅度增长;执行速度更快;由于替换会出现操作符优先级的问题;参数若出现带有副作用的参数,影响结果;参数类型只要符合表达式操作均可,灵活性强,严谨性弱;不可调试;不能递归

函数:函数的多次调用也只使用一块代码区域内的函数;由于函数的调用阶段会发生参数传参、栈帧创建,且函数结束也会消耗时间,所以执行速度慢;不容易出现操作符问题;参数类型要求严格,灵活性差、严谨性强;可调试;能递归

7.命名约定 :宏名全部大写,函数名并不需要全部大写

8.#undef 移除宏定义

9.条件编译

形式一

?

形式二

?

形式三 判断标识符是否已经定义

?

?

形式四 嵌套指令

?

10.避免头文件被反复多次调用

方法一:#pragma once

方法二:

11.引用头文件时候<>和""的区别

一般使用头文件

#include<stdio.h> 在引用库目录下的头文件多用<>

#include"test.h" 在引用自己编写的头文件用""

为什么呢?

是因为二者的查找策略不同。

<>的查找策略是直接取库目录下查找。

""的查找策略是1.先去代码的所在路径下查找

? ? ? ? ? ? ? ? ? ? ? ? ?2.如果第一步没找到再去库目录下查找

一般建议,库目录下的头文件用<>引,自己编写的头文件用""引。

最后呢,再友情赠送一道百度笔试题!

?

?定义宏的时候,千万要注意括号的使用!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:37:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 20:28:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码