C 语言是一种通用的、面向过程式的计算机程序设计语言。
程序——一组计算机能识别和执行的指令。
一个特定的指令序列来完成一定的功能。
程序=算法+数据结构
1.1 使用 C 的场景
操作系统 |
语言编译器 |
汇编器 |
文本编辑器 |
数据库 |
网络驱动器 |
现代程序 |
语言解释器 |
实体工具 |
|
后台打印服务(Print Spooler) |
1.2 C语言 程序结构
C 程序主要包括以下部分:
预处理器指令、 函数、 变量、 语句 & 表达式、 注释
//--------------------------------------------------//
#include <stdio.h> //#include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。
int main() //主函数,程序从这里开始执行。
{
/* 我的第一个 C 程序 */ //将会被编译器忽略,这里放置程序的注释内容。
printf("Hello, World! \n");
return 0; //终止 main() 函数,并返回值 0。
}
//--------------------------------------------------//
1.3 C语言 基本语法
1.3.1. 分号 ;
在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
1.3.2. 注释 // /* */
注释就像是 C 程序中的帮助文本,它们会被编译器忽略。它们以 /* 开始,以字符 */ 终止
以 // 开始的单行注释,这种注释可以单独占一行。
以 /* */ 这种格式的注释可以单行或多行。
1.3.3. 标识符
C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。
一个标识符以字母 A-Z 或 a-z 或 下划线_ 开始,后跟零个或多个字母、下划线和数字(0 - 9 )。
C 标识符内不允许出现标点字符,比如 @、$ 、 %。
C 是区分大小写的编程语言。
1.3.4. 关键字
auto |
else |
long |
switch |
break |
enum |
register |
typedef |
case |
extern |
return |
union |
char |
float |
short |
unsigned |
const |
for |
signed |
void |
continue |
goto |
sizeof |
volatile |
default |
if |
static |
while |
do |
int |
struct |
_Packed |
double |
|
|
|
1.3.5. C 中的空格
只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。
1.4 C程序运行步骤
1.5 C语言程序风格
1.5.1 创建一个“Application.c”
/*-----------------------------------------------------------------------*/
/*
* 变更历史:
* 2025-12-18 CLS XXXXXXXX.
* 2025-12-10 CLS XXXXXXXX.
* 2025-10-30 CLS 创建该模板文件.
*/
/*-----------------------------------------------------------------------*/
/*
* @file Application.c
* @brief
* 功能:
* <li>关于 Application.c 的功能描述:
* 1.main函数的创建;
* 2.Function函数的配置;
* 3.XXXXXXXX.
* 4.XXXXXXXX.
* 5.XXXXXXXX.
* </li> 本文件用于XXXX应用开发。 </li>
*/
/*-----------------------------------------------------------------------*/
/* 头文件 */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <errno.h>
/*-----------------------------------------------------------------------*/
/* 宏定义 */
#define RNUM 25 /* 接收类端口 最大配置个数 */
#define TNUM 0 /* 发送类端口 最大配置个数 */
/*-----------------------------------------------------------------------*/
/* 全局变量 */
RETURN_CODE_TYPE retCode; /* API函数返回值 */
/*-----------------------------------------------------------------------*/
/* 函数申明 */
int APP_Init(void);
void FunctionalModule(void);
/*-----------------------------------------------------------------------*/
/*
* @brief
* 关于 main 的功能描述:
* 应用功能任务主函数.
* @param[in] void
*
* @return void
*
* @implements 低层需求标识号 XXXX
*/
void main(void)
{
int k = 0; /* 调度次数计数器 */
/*-----------------------*/
APP_Init(); /* 应用初始化 */
/*-----------------------*/
printf("------------------------------------\n");
printf("---- APP Running! ---- \n"); /* 功能任务开始打印 */
printf("------------------------------------\n\n\n");
/*-----------------------*/
while (1)
{
printf("------------------------------------\n"); /* 调试打印 */
/*-----------------------*/
ReceivePort(); /* 接收端口函数 */
/*-----------------------*/
FunctionalModule(); /* 应用功能模块函数 */
/*-----------------------*/
SendPort(); /* 发送端口函数 */
/*-----------------------*/
printf("The %d call to the function\n", k + 1); /* **调度次数打印显示** */
k++; /* 任务调度次数 */
printf("------------------------------------\n");
printf("\n\n\n");
/*-----------------------*/
}
/*-----------------------*/
printf("End of APP run !!! \n"); /* 功能任务结束打印 */
/*-----------------------*/
}
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*
* @brief
* 关于 APP_Init 的功能描述:
* 应用工程初始化函数.
* @param[in] void
*
* @return int ret
* ret=0: 初始化成功.
* ret=-1: 初始化失败.
* @implements 低层需求标识号 XXXX
*/
int APP_Init(void)
{
int ret = 0;
/*-----------------------*/
/* 应用工程标签打印 */
printf("\n"); printf("\n"); printf("\n");
printf("[------------------------------------------------------]\n");
printf("\t ------ Name: XXXX application project ------\n");
printf("\t ------ Product Mode: V0.01 ------\n");
printf("\t ------ P/N: XXXX-XX-XXX-001 ------\n");
printf("\t ------ Version Number: A1 ------\n");
printf("\t ------ Time: 2024.12.30__00:30 ------\n");
printf("\t ------ HG-Company ------\n");
printf("\t ------ Designer: CLS ------\n");
printf("[------------------------------------------------------]\n");
printf("\n"); printf("\n");
/*-----------------------*/ /* 全局变量初始化 */
/*-----------------------*/ /* 工程初始化配置 */
/*-----------------------*/ /* 创建收发端口 */
/*-----------------------*/
return ret;
}
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*
* @brief
* 关于 FunctionalModule 的功能描述:
* 应用功能模块函数.
* @param[in] void
*
* @return void
*
* @implements 低层需求标识号 XXXX
*/
void FunctionalModule(void)
{
/*-----------------------*/
printf("APP Functional Module ......\n");
/*-----------------------*/
/*-----------------------*/
}
/*-----------------------------------------------------------------------*/
1.5.2 创建一个“PortConfig.h”
/*-----------------------------------------------------------------------*/
/*
* 变更历史:
* 2024-10-10 XXX 变更内容xxxx.
* 2024-08-30 CLS 创建该文件.
*/
/*-----------------------------------------------------------------------*/
/*
* @file PortConfig.h
* @brief
* 功能:
* <li>关于 PortConfig.h 的功能描述
* 端口配置结构数据 头文件
* </li>
*/
/*-----------------------------------------------------------------------*/
#ifndef _PORTCONFIG_H
#define _PORTCONFIG_H
/*-----------------------------------------------------------------------*/
/* 头文件 */
#include <fcntl.h>
/*-----------------------------------------------------------------------*/
/* 宏定义 */
#define PORT_NAME_MAX 50 /* Port 端口名称 最大占字节 */
#define RNUM 30 /* 接收类端口 最大配置个数 */
#define TNUM 10 /* 发送类端口 最大配置个数 */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* 输入输出端口配置信息
* struct PortConfig 保存所有输入输出端口配置信息数据.
*/
struct PortConfig
{
char KeyWord[4]; /* struct PortConfig 数据段起始标记,"Port"--0x50 6F 72 74 */
unsigned int BlockSize; /* struct PortConfig 数据段所占大小,以字节计 */
struct RxSampling rxsampling; /* 接收端口 */
struct TxSampling txsampling; /* 发送端口 */
};
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* 全局变量 */
extern unsigned char recv_data[RNUM][S_BYTE_MAX]; /* 接收端口 端口数据信息 */
extern unsigned char send_data[TNUM][S_BYTE_MAX]; /* 发送端口 端口数据信息 */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
#endif /* _PORTCONFIG_H */
/*-----------------------------------------------------------------------*/
C语言格式特点:
习惯用小写字母,大小写敏感
不使用行号,无程序行概念
可使用空行和空格
常用锯齿形书写格式
C编码基本要求:
使用TAB缩进
{}对齐
有足够的注释
有合适的空行
1.6 C工程开发步骤
C工程开发步骤通常包括以下几个阶段,从需求分析到最终的发布和维护。下面是一个典型的C工程开发流程:
1.6.1. 需求分析
- 目标确认:明确要开发的系统或软件的功能需求。
- 性能要求:确定系统的性能需求,如响应时间、内存使用、并发处理等。
- 限制条件:包括硬件限制、操作系统要求等。
1.6.2. 设计阶段
- 系统设计:定义系统架构,包括模块划分、接口设计等。
- 数据结构设计:根据需求确定使用的数据结构,如链表、数组、树、哈希表等。
- 算法设计:设计必要的算法,确保代码高效运行。
- 接口设计:定义模块间的接口、通信协议等。
1.6.3. 编码阶段
- 代码编写:根据设计文档编写C语言代码,完成各个模块的功能实现。
- 遵循编码规范:确保代码符合标准的C语言编码规范,易于阅读和维护。
- 单元测试:开发过程中对各模块进行单元测试,确保各个模块的功能正确。
1.6.4. 集成和测试阶段
- 模块集成:将各个模块的代码进行集成,确保系统功能的整体实现。
- 系统测试:对整个系统进行测试,包括功能测试、性能测试和压力测试。
- 调试:使用调试工具(如GDB)和日志分析工具排除代码中的问题,解决内存泄漏、指针错误等常见问题。
1.6.5. 优化阶段
- 性能优化:对系统进行性能优化,包括减少内存占用、提高执行速度等。
- 代码优化:消除冗余代码,提高代码的可维护性和可读性。
- 资源优化:优化硬件资源使用,如CPU和内存。
1.6.6. 文档和维护
- 文档编写:编写项目文档,包含开发文档、用户手册等。
- 版本控制:使用版本控制工具(如Git)管理代码版本,进行代码的发布和管理。
- 维护和更新:发布后的项目进入维护阶段,修复可能出现的bug,并根据需求进行版本迭代和更新。
1.6.7. 部署和发布
- 部署:将软件部署到目标环境,如服务器或嵌入式设备。
- 发布:发布正式版本,并根据反馈进行后续的改进和更新。
1.6.8. 后期支持
- 监控:监控系统运行状况,及时发现问题。
- 用户支持:为用户提供技术支持,解答使用过程中遇到的问题。
每个步骤都需要注意代码质量、可维护性、性能等方面,尤其是在C语言这种接近硬件的语言中,资源管理和内存管理尤为重要。
1.7 Visual Studio 创建C工程
1.首先桌面上双击打开vs2022,进入如下界面,根据需要所创建的工程,“创建新项目”;
2.在弹出的“创建新项目”窗口中,搜索框输入 "C++",因为 Visual Studio 默认是为 C++ 提供支持,而 C 语言也可以使用 C++ 项目模板。
选择 "空项目",然后点击 Next(下一步)。
3.在下一个窗口中,设置项目的名称和存储位置。例如,可以命名为 `Project1`,并选择合适的文件夹存储项目文件。
- 选择好存储位置后,点击 Create(创建)。
4. 在右侧的资源管理器中“源文件”,点击“添加”,点击“新建项”;
- 添加文件名“App.c”
5. 在 “App.c”中添加 对应的工程代码
6. 在上方栏中“工具”--“选项”,可配置 VisualStudio 工程界面
7. 左侧栏,点击出现红色圈,即调试断点位,键盘“F5”,使工程进入 调试态。
8. 键盘“Ctrl+F5”,使工程进入 执行态。
非常感谢您的支持!创作不易,转发备注出处!
自用展示内容,不定期更新维护内容,让我们把 C开发 变得更专业。
十年开发基本功,常年开班收徒(一年学徒制度),每年10个名额。
商业合作加微信,项目接包与外包。