#与##的用法

news/2024/7/24 13:18:15/

#

作用: 左右加双引号,使其变成字符串

#的作用:是在形参左右各加双引号,使它变成字符串。#define   STR(param)    #paramchar  *pStr = STR(hello); // 展开后 char *pStr = “hello”;

##

作用:胶水,使2个粘合在一起。

#define def_u32_array(__name, __size)     uint32_t array_##__name[__size];def_u32_array(sample_buffer, 64)
展开后
uint32_t array_sample_buffer[64];#define log_info(__STRING, ...)    printf(__STRING,##__VA_ARGS__)
printf("------------------------------------\r\n");
printf(" Cycle Count : %d", total_cycle_cnt);

...

作用:在代码里运行。

#define safe_atom_code(...)                          \{                                            \uint32_t int_flag = __disable_irq();     \__VA_ARGS__                              \__set_PRIMASK(int_flag);                 \}这里定义了一个宏"safe_atom_code()",在括号内,无论你填写任何内容,
都会被无条件的放置到“__VA_ARGS__”所在的位置,你可以认为括
号里的“...”实际上就是对应"__VA_ARGS__"。比如,我们可以写下这样的代码:/**\fn          void wr_dat (uint16_t dat)\brief       Write data to the LCD controller\param[in]   dat  Data to write
*/
static __inline void wr_dat (uint_fast16_t dat) 
{safe_atom_code(LCD_CS(0);GLCD_PORT->DAT = (dat >>   8);   /* Write D8..D15 */GLCD_PORT->DAT = (dat & 0xFF);   /* Write D0..D7 */LCD_CS(1);)
}#define XXXX_INIT(...)    xxxx_init((NULL,##__VA_ARGS__))

#define EXAMPLE(...) ( 默认值 ,##__VA_ARGS__)

C语言中几种特殊标准定义和用法

static关键字:在C语言中,static关键字用于定义静态变量、静态函数和静态全局变量。静态变量在函数内部定义时,其值在函数调用结束后仍然保持不变;静态函数只能在声明它的源文件中使用;静态全局变量的作用域限制在声明它的源文件中。const关键字:const关键字用于定义常量,即不可修改的变量。使用const关键字可以提高代码的可读性和可维护性,同时可以避免程序中某些变量被误修改的风险。volatile关键字:volatile关键字用于定义易变变量,即在程序执行过程中可能被意外修改的变量。使用volatile关键字可以告诉编译器,该变量的值可能会在意料之外的时候被修改,从而保证程序的正确性。restrict关键字:restrict关键字用于告诉编译器,指针变量是唯一访问某个内存区域的指针。通过使用restrict关键字,编译器可以进行更多的优化,提高程序的性能。inline函数:inline函数用于定义内联函数,即将函数的定义直接插入到调用函数的地方,从而减少函数调用的开销。使用inline函数可以提高程序的执行效率。
C语言的发展历史可以分为多个阶段,每个阶段都对应一个标准。C语言的标准化是为了保证不同编译器、不同操作系统下的程序能够有一致的行为,同时也方便程序员进行交流和开发。本文将介绍C语言的几个标准及其主要特点。
一、K&R C
K&R C 是 C语言的第一个标准,由 C语言的创始人 Dennis Ritchie 和 Brian Kernighan 于 1978 年在其著作《The C Programming Language》中定义。K&R C 标准包含了 C语言的基本语法、数据类型、运算符等,但是并不是完整的语言规范,缺少了一些重要的特性,例如函数原型、结构体等。因此,K&R C 标准已经过时,不再被广泛使用。
二、ANSI C
ANSI C 是 C语言的第二个标准,由美国国家标准协会(ANSI)于 1983 年发布。该标准定义了 C语言的全部语法、数据类型、库函数等,是 C语言的第一个完整的规范。ANSI C 标准还引入了一些新特性,例如函数原型、void 类型、const 限定符等。ANSI C 标准被广泛采用,成为了 C语言的主流标准。
三、C89/C90
C89/C90 是 ISO/IEC 9899 标准,也是 ANSI C 的国际标准版本,于 1989 年发布。该标准与 ANSI C 基本一致,但是对于一些问题进行了更严格的定义,例如字符集、浮点数计算等。C89/C90 标准成为了 C语言的主流标准,并被广泛应用于各个领域。
四、C99
C99 是 ISO/IEC 9899:1999 标准,于 1999 年发布。C99 标准对 C语言进行了大量的扩展和改进,引入了很多新特性,例如布尔类型、复数类型、变长数组、标准宏等。C99 标准还修正了一些 C89/C90 标准中的错误和不足之处,使得 C语言更加完善和健壮。C99 标准在学术界和一些特定领域得到了广泛的应用,但在工业界的普及程度相对较低。
五、C11
C11 是 ISO/IEC 9899:2011 标准,于 2011 年发布。C11 标准在 C99 基础上进行了进一步的扩展和改进,包括了一些新特性,例如泛型宏、多线程支持、_Static_assert 等。C11 标准对于一些早期 C标准中存在的问题进行了修正,使得 C语言更加健壮和安全。C11 标准在工业界的普及程度相对较低,但已经被一些编译器支持。
六、C17
C17 是 ISO/IEC 9899:2018 标准,于 2018 年发布。C17 标准在 C11 基础上进行了一些小的修订和更新,主要是对标准库进行了一些改进和扩展。C17 标准对于C语言本身的特性并没有做出太大的改变,主要是对于一些库函数进行了更新和扩展。C17 标准目前还比较新,尚未得到广泛的应用。总的来说,C语言的标准化历程经历了多个阶段,每个阶段都对应一个标准。从最初的 K&R C 到后来的 ANSI C、C89/C90、C99、C11、C17 等版本,C语言的特性逐渐得到完善和改进,同时也保证了不同编译器、不同操作系统下的程序能够有一致的行为。C语言的标准化是保证程序员能够更加规范地编写程序、更加方便地进行交流和开发的重要保障。


http://www.ppmy.cn/news/1114678.html

相关文章

计组-机器字长、存储字长、指令字长以及和他们有关的机器位数

🌳🌳🌳前言:本文总结了机器字长、存储字长、指令字长的概念以及和它们相关的机器位数。 目录 字长 机器字长 指令字长 存储字长 寄存器的位数 总结 字长 🌟字长一个字中的二进制位数。 🌟字长由微处…

实现可观测性平台的技术要点是什么?【赠书活动|第九期《可观测性工程》】

实现可观测性平台的技术要点是什么? 兼容全域信号量所谓全域信号量有哪些?统一采集和上传工具统一的存储后台自由探索和综合使用数据总结推荐阅读《可观测性工程》直播预告预约直播抽奖方式 随着可观测性理念的深入人心,可观测性平台已经开始…

Electron和vue3集成(可用于生产打包)

注意:我使用的是node版本16.20.1,因为electron-builder插件仅支持到node17、不支持node18,而node16是LTS版本,所以我选择16 1、初始化vue项目 npm install -g vue vue create 项目名称cd 项目目录 我尝试了用脚手架初始化方式&…

Postman应用——测试脚本Test Script

文章目录 Test Script脚本CollectionFolderRequest 解析响应体断言测试 测试脚本可以在Collection、Folder和Request的Pre-request script 和 Test script中编写,测试脚本可以检测请求响应的各个方面,包括正文、状态代码、头、cookie、响应时间等&#x…

24v转5v稳压芯片-5A大电流输出ic

这款24V转5V5A汽车充电芯片具有以下特性和参数: - 宽输入电压范围:4.5V至36V - 最大输出电流:5.0A - 高达92%的转换效率 - 恒流/恒压模式控制 - 最大占空比100% - 可调输出电压 - 2%的输出电压精度 - 集成40mΩ高侧开关 - 集成18mΩ低侧开关 …

PyCharm导入python项目

进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹; 打开了python项目后,需要配置该项目对应的python才可以正常运行; 配置步骤:File→settings 在设置弹窗中选择Project Interpreter,然后点击ad…

Eolink Apikit 接口文档生成与导出

在 API 研发管理产品中,几乎所有的协作工作都是围绕着 API 文档进行的。 采用文档驱动的协作模式会比先开发、后维护文档的方式更好,团队协作效率和产品质量都能得到提高。基于文档来进行工作,使用文档驱动方式可以降低大量无意义的沟通成本…

不负昭华,前程似锦,新一批研发效能认证证书颁发丨IDCF

亲爱的认证学员, 恭喜你成功获得由国家工业和信息化部教育与考试中心颁发的职业技术证书——《研发效能(DevOps)工程师国家职业技术认证》。你的努力和才华得到了官方的认可,这是你职业生涯中的一个重要的里程碑。 这个证书不仅代表着你的专业知识和技…

gitlab在项目中创建自己的分支的顺序操作,一整套流程

gitlab在项目中创建自己的分支的顺序操作,一整套流程 目录概述需求: 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better…

大模型赛道如何实现华丽的弯道超车【赠书活动|第十期《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》】

文章目录 01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率,降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 通过分布式缓存实现数据本地性03 优化整个工作流的数据共享04 通…

OGAI详解:AIStation调度平台如何实现大模型高效长时间持续训练

大模型是当前通用人工智能产业发展创新的核心技术,目前国内已发布的生成式AI模型超过了100个。面向以大模型为核心的生成式AI开发与应用场景,近日浪潮信息发布了大模型智算软件栈OGAI(Open GenAI Infra)——“元脑生智”&#xff…

结构体编解码神器---Mapstructure

目录 一:介绍二:安装三:使用3.1: 简单使用案例3.2: 字段标签3.3: 结构体嵌套3.4: 统一存储未映射的值3.5: 逆向转换3.6: 收集绑定信息 一:介绍 简言之: mapstructure是GO字典(map[string]interface{})和Go结构体之间转…

哪些测试项目可以使用自动化测试?

通常,软件测试v的测试方式分为人工测试和自动化测试,人工测试是由测试人员编写并执行测试用例,然后观察测试结果与预期结果是否一致的过程;自动化测试是通过测试工具来代替或辅助人工去验证系统功能是否有问题的过程。 采用自动化测试需要满…

早知道这些免费 API,我就可以不用到处爬数据了

豆瓣开放 https://developers.douban.com/wiki/ 淘宝开放平台API 商品详情接口 http://open.taobao.com/ IP地址查询 http://apistore.baidu.com/apiworks/servicedetail/114.html 频道新闻API_易源 http://apistore.baidu.com/apiworks/servicedetail/688.html 微信热…

软考 - 系统架构设计师如何备考?文中含资料分享和备考心得

前言 我参加了2022年11月份的《软考-系统架构设计师》考试,在两个多月的备考之中我总结了一些学习经验和答题技巧,现毫无保留的分享给大家,希望对报考的同学们有所帮助。 一、软考的作用 1、以考代评(国企、事业单位、公务员评职…

【Web_环境搭建_Python3_pip】pip的升级、安装、更新、卸载,以及pipupgrade和pip-review的基础使用

** 官方说明 ** pip(Python Package Index)是一个以 Python 语言写成的软件包管理系統,使用 pip 可以非常方便的安装和管理 python 软件包PIP ** 查看信息 ** 查看版本 : pip --version查看已有 : pip list、pip freeze查看帮助 : pip help查看库信息 : pip show -f package_…

多台服务器sessionId共享

目录 多台服务器sessionId共享解决方案:ASP.NET Core 参考代码(NET 7):登录处理登录(请求)过滤器过滤器使用BaseController 多台服务器sessionId共享 session id是服务器首次与浏览器创建连接时,生成的id值,存入浏览器…

【前端】jquery获取data-*的属性值

通过jquery获取下面data-id的值 <div id"getId" data-id"122" >获取id</div> 方法一&#xff1a;dataset()方法 //data-前缀属性可以在JS中通过dataset取值&#xff0c;更加方便 console.log(getId.dataset.id);//112//赋值 getId.dataset.…

扔掉你的开发板,跟我玩Mcore-全志h616

本文转载自WhyCan Forum(哇酷开发者社区)&#xff1a; https://whycan.com/t_10024.html 作者leefei 这是一个1.69寸触摸小电视。使用全志H616芯片&#xff0c;板上硬件有mpu6050陀螺仪&#xff0c;USB转ttl调试串口&#xff0c;一个USB接口&#xff0c;WIFI&蓝牙&#x…

【蓝桥杯选拔赛真题61】Scratch小猫照镜子 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch小猫照镜子 一、题目要求 编程实现 二、案例分析 1、角色分析