【C语言】C语言编译链接和Win32API简单介绍

目录

  • 翻译环境和运行环境
    • 翻译环境
      • 编译器
        • 预处理(预编译)
        • 编译
        • 链接
    • 执行环境
  • Win32API是什么
  • 控制台程序
  • 控制台获取坐标COORD
  • GetStdHandle函数
  • GetConsoleCursorinfo函数
  • CONSOLE_CURSOR_INFO
  • SetConsoleCursorInfo函数
  • SetConsoleCursorPostion函数
  • GetAsyncKeyState函数

在这里插入图片描述

翻译环境和运行环境

翻译环境

翻译环境就是在这将源代码转换成可执行的二进制指令(机器指令)。

进行编译和链接过程。

在这里插入图片描述

.c源程序先单独经过编译器生成对应的目标文件.obj(在windows环境下).o(在Linux环境下)。

多个目标文件和链接库一起经过链接器生成可执行程序。

编译器

编译器分为3个过程 预处理(预编译),编译,汇编。
在这里插入图片描述

预处理(预编译)

主要处理源文件中#开始的预编译指令。
规则如下:

  1. 将宏定义替换进去并删除#define。
  2. 处理条件编译。
  3. 删除注释 。
  4. 将头文件包含内容插入预编译位置。该头文件中可以包含其他头文件(可以递归进行)。
  5. 添加行号和文件名表示,以便后续生成调试信息。
  6. 保留#pragma的编译指令。
编译
  1. 词法分析:将代码中的字符分割为一系列记号(关键字,标识符,字面量,特殊字符等)。
  2. 语法分析:将词法分析产生的记号进行语法分析,产生语法树。
  3. 语义分析:对表达式的语法层面分析。
链接

过程主要包括:地址和空间分配,符号决议和重定位等步骤。

目的:将一堆文件链接在一起生成可执行文件。

执行环境

执行环境就是用于实际执行代码。

Win32API是什么

Win32API百度介绍就是这样:
在这里插入图片描述
意思就是有一系列函数服务于应用程序,这些函数简称API(Application Programming Interface)函数。

控制台程序

平常我们使用的黑框程序就是控制台程序,那我们可以调整它的大小吗?当然。
我们就用cmd命令来控制窗口的长宽和名字,以修改为20行,100列和贪吃蛇名字为例。

system("mode con cols=100 lines=20;")
system("title 贪吃蛇");

控制台获取坐标COORD

在控制台程序中,左顶角就是坐标(0,0),往右是x横轴,往下是y轴。
而COORD是Windows API中定义的一个结构体用来表示坐标。
类型声明如下:

typedef struct _COORD{SHORT X;SHORT Y;
}COORD,*PCOORD;

GetStdHandle函数

在这个函数是用于从一个特定的标准设备(标准输入、标准输出或标准错误)中获得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。

HANDLE hOutPut = NULL;//初始一个句柄
hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleCursorinfo函数

用于指定控制台屏幕缓冲区的光标大小和可见性信息。
使用例子:

HANDLE hOutPut = NULL;//初始一个句柄
//获得标准输出的句柄
hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorinfo(hOutPut,&CursorInfo);//获取光标信息

CONSOLE_CURSOR_INFO

这是一个结构体,包含有关控制台光标的信息。
类型声明如下:

typedef struct CONSOLE_CURSOR_INFO{DWORD dwSize;BOOL bVisible;
}CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;

dwSize表示字符单元格所占大小(百分比),bVisible表示光标可见性,可见值为TRUE。

SetConsoleCursorInfo函数

设置控制台光标大小和可见性。
使用实例:

HANDLE hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);
//隐藏光标
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutPut,&CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false;//隐藏光标
SetConsoleCursorInfo(hOutPut,&CursorInfo);//设置控制台光标状态

SetConsoleCursorPostion函数

设置控制台屏幕缓冲区的光标位置。
使用实例:

COORD pos = {10,5};
HANDLE hOutPut = NULL;
hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPostion(hOutPut,pos);

GetAsyncKeyState函数

获取按键情况的函数。
将键盘上每个键的虚拟键值传给函数,函数通过返回值判断改键的状态。
函数的返回值是16位的short类型,最高位是1,说明当前按键是按下状态,最高位是0,说明当前按键是抬起状态。如果最低位被置为1说明按键被按过,否则为0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt(MSVC)下报“语法错误缺少“}““语法错误缺少“常数“ 的解决办法

1.现象 目前我在工程中试图使用QHttpServer时,一编译,就报了一堆奇奇怪怪的错误: D:\Qt\httpServer\Qt5.15.2\include\QtHttpServer\qhttpserverrequest.h:75: error: C2143: 语法错误: 缺少“}”(在“(”的前面) D:\Qt\httpServer\Qt5.15.…

栈和队列---循环队列

1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接…

人工智能笔记分享

文章目录 人工智能图灵测试分类分类与聚类的区别(重点)分类 (Classification)聚类 (Clustering) 特征提取 分类器(重点)特征提取为什么要进行特征提取?(重点)分类器 训练集、测试集大小&#x…

【分布式技术】——监控平台zabbix 介绍与部署

一、监控系统的相关知识 1.监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常,往往存在着很多的服务器、网络设备等硬件资源,如果我们想要能够更加方便的、集中的监控他们,zabix可以实现集中监控管理的应用程序 监控的初衷…

Spring SimpleAsyncTaskExecutor学习

一. 简介 SimpleAsyncTaskExecutor,不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程,没有最大线程数设置;并发大的时候会产生严重的性能问题;在 Java 中创建线程并不便宜,线程对…

C#——封装详情

C# 封装 封装是面向对象编程中的一个核心概念,它使得对象的状态(即数据)不会被直接访问,而是通过方法(即行为)来控制和操作。封装可以提高代码的内聚性和可维护性,同时也提供了一种保护数据不被…

ARM汇编与机器码、汇编指令

文章目录 1. CISC与RISC指令集 2. ARM汇编指令 3. 汇编与机器码 4. 汇编指令格式 5. MOV指令 6. BL指令 7. B指令 8. ADD/SUB指令 9. LDR/STR指令 1. CISC与RISC指令集 根据指令的复杂度,所有CPU可以分为两类: CISC(Complex Instr…

C#——多态详情

多态 多态: 是同一个行为,具有多个不同表现形式或形态的能力 多态分为两种 : 静态性多态: 函数重载,符号重载动态性多态: 虚方法,抽象类,接口 静态多态 在编译时,函数和对象的连接机制被称为早期绑定,…

知识图谱的符号表示

1、基于图的表示建模 2、有效标记图 3、属性图表示方法的优点和去点 4、RDF是什么?表达是有限的 5、OWL,本体语言 6、OWL有很多家族 7、属性图、RDF\三元组、关系图 ---------------------------PPT---------------------

三级_网络技术_07_IP地址规划技术

1.IP地址192.168.15.1/27的子网掩码可写为()。 255.255.255.192 255.255.255.224 255.255.255.240 255.255.255.248 2.IP地址块211.64.0.0/11的子网掩码可写为()。 255.192.0.0 255.224.0.0 255.240.0.0 255.248.0.0 3.IP地址块59.67.159.125/11的子网掩码可写为()。…

STM32与W25Q64 Flash:SPI通信协议的高效实现策略

摘要 在嵌入式系统中,SPI通信协议是实现微控制器与非易失性存储设备如W25Q64 Flash存储器之间数据交换的关键技术。本文将探讨STM32微控制器与W25Q64 Flash存储器通过SPI进行通信的高效实现策略,包括硬件配置、SPI接口编程、性能优化技巧以及实际代码示…

已解决 javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!!

已解决 javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!! 目录 一、问题分析 二、报错原因 三、解决思路 四、解决方法 五、总结 博主v:XiaoMing_Java 博主v&#x…

【微服务网关——服务发现】

1.服务发现 1.1 介绍 服务发现是指用注册中心来记录服务信息,以便其他服务快速查找已注册服务服务发现分类: 客户端服务发现服务端服务发现 1.2 客户端服务发现 客户端服务发现(Client-side Service Discovery)是一种微服务架构中的模式…

Vine: 一种全新定义 Vue 函数式组件的解决方案

7月6日的 vue confg 大会上 ShenQingchuan 大佬介绍了他的 Vue Vine 项目, 一种全新定义 Vue 函数式组件的解决方案。 和 React 的函数式组件有异曲同工之妙,写起来直接起飞了。 让我们来快速体验一下 vine, 看看到底给我们带来了哪些惊喜吧…

释放计算潜能:Mojo模型与分布式训练的融合之道

释放计算潜能:Mojo模型与分布式训练的融合之道 在当今数据驱动的世界中,机器学习模型常常需要处理庞大的数据集,并且模型的复杂性也在不断增加。这导致训练模型所需的计算资源和时间显著增长。分布式训练作为一种有效的解决方案,…

[Python]配置邮件服务,发送邮件

本文以163邮件系统为例,登录之后,点击设置,开启如下设置项。 即可使用代码发送邮件,并携带附件。 开启SMTP 普通邮件 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart# 1…

文心一言常用的指令

文心一言作为一款强大的人工智能模型,支持多种类型的指令,以满足用户的不同需求。以下是一些文心一言常用的指令类型及其具体示例,这些指令按照不同的功能和用途进行分类和归纳: 1. 查询类指令 知识问答: 指令示例&a…

[算法] 优先算法(四):滑动窗口(下)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

python 性能提升-C扩展

文章目录 python的缺点性能提升C扩展案例python的缺点 运行效率低 性能提升 性能瓶颈问题使用如下方式解决: C/C++实现耗时的代码,然后使用gcc/g++编译为动态库dll/so,在python中使用ctypes模块进行加载动态库;C为python耗时的代码编写扩展,需使用 Python.h 头文件,…

20240708 每日AI必读资讯

🤖破解ChatGPT惊人耗电!DeepMind新算法训练提效13倍,能耗暴降10倍 - 谷歌DeepMind研究团队提出了一种加快AI训练的新方法——多模态对比学习与联合示例选择(JEST),大大减少了所需的计算资源和时间。 - JE…