1. C语言 简介

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程序运行步骤

1c8cd79bebca4ca18fe47109ef3fcb03.png

 

 

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,进入如下界面,根据需要所创建的工程,“创建新项目”;

1dcf02ede2c4409ab41bf373ee53e80e.png

2.在弹出的“创建新项目”窗口中,搜索框输入 "C++",因为 Visual Studio 默认是为 C++ 提供支持,而 C 语言也可以使用 C++ 项目模板。

   选择 "空项目",然后点击 Next(下一步)。

b3d1cb2065ed4e75806a8159384ce1af.png

3.在下一个窗口中,设置项目的名称和存储位置。例如,可以命名为 `Project1`,并选择合适的文件夹存储项目文件。

   - 选择好存储位置后,点击 Create(创建)。

0f1351d129e54e569349c627c9064a40.png

4. 在右侧的资源管理器中“源文件”,点击“添加”,点击“新建项”;

- 添加文件名“App.c”

086ffa391fac4a3fa99a7ee906a448ee.png479eefa856ef467bb2e769c07af36603.png

 

5. 在 “App.c”中添加 对应的工程代码

f0bd5311af4e4a2588adebf7f39809e1.png

6. 在上方栏中“工具”--“选项”,可配置 VisualStudio 工程界面

b60a1788bcf34a2981c56515e7cd057d.png

7. 左侧栏,点击出现红色圈,即调试断点位,键盘“F5”,使工程进入 调试态。

e85c9ace52174debb0d8590077893c94.png

8. 键盘“Ctrl+F5”,使工程进入 执行态。

0e1887ec098c4800bd07746150115b85.png

 

非常感谢您的支持!创作不易,转发备注出处!

自用展示内容,不定期更新维护内容,让我们把 C开发 变得更专业。

 

十年开发基本功,常年开班收徒(一年学徒制度),每年10个名额。

商业合作加微信,项目接包与外包。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值