#与##的用法

news2024/9/23 17:16:14

#

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

#的作用:是在形参左右各加双引号,使它变成字符串。

#define   STR(param)    #param

char  *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.coloradmin.cn/o/1019919.html

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

相关文章

无涯教程-JavaScript - MUNIT函数

描述 MUNIT函数返回指定尺寸的单位矩阵。 语法 MUNIT (dimension)争论 Argument描述Required/OptionalDimension Dimension是一个整数,指定要返回的单位矩阵的尺寸。 尺寸必须大于零。 Required Notes MUNIT返回一个数组。因此,应将其作为数组公式输入 MUNIT (N)$\begin{m…

朴素贝叶斯案例分析

贝叶斯模型是利用先贝叶斯定理进行计算的一种机器学习模型,并且此处涉及先验概率和后验概率。比如我们都知道去赌场会十赌九输,此是以前的经验,即为先验概率,也或者大家都知道抛硬币时上下面第一次都是1/2概率,这均为先…

如何制作一篇公众号推文?纯干货

公众号推文是一种通过微信公众号平台向用户传播信息和内容的方式,具有广泛的受众群体和良好的传播效果。下面伯乐网络传媒给大家分享关于如何制作一篇公众号推文的一些建议和步骤,建议收藏起来慢慢看! 确定目标受众:在开始制作推文…

Matlab编程中函数的重命名方法

Matlab编程中函数的重命名方法 在进行matlab编程时候,有时需要根据自己的习惯,需要对函数重命名。本文简要介绍重命名的方法。 一、重命名的方法 通过和赋值号实现,如下所示: 新函数名原函数名二、具体举例 clc clear all %将…

第二章-H3C-网络设备操作入门

6.2 路由器与交换机的作用与特点 6.2.1 路由器的作用与特点 路由器的作用 1.连接具有不同介质的链路 2.连接网络或子网,隔离广播 3.对数据报文执行寻址和转发 4.交换和维护路由信息 6.2.2 交换机的作用与特点 交换机的作用 1.连接多个以太网物理网段,隔…

武汉凯迪正大—雷电冲击电压发生器

雷电冲击电压发生器系统特点 1.采用PLC可编程控制器技术,使控制系统实现超小型化及高可靠性能的智能自动控制和测量;配合我公司的数字化测控系统方便的与计算机连接,实现计算机智能自动控制、测量和管理 。 2.输出极…

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

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

JeecgBoot 低代码安装 运行开发

技术文档 技术官网: http://www.jeecg.com在线演示 : http://boot.jeecg.com标签 :BasicTable 表格 - JeecgBoot 文档中心入门视频: https://space.bilibili.com/454617261/channel/series 微服务开发: 单体切换为微…

数据结构与算法课后题-第二章(顺序表)

第二章 01题目&#xff0c;存储相对紧凑&#xff0c;所以存储的密度大。 04题目&#xff0c;顺序表可以按照序号随机存取&#xff0c;时间的复杂度为O(1)。 第7题目分析 #include <iostream> using namespace std;#define MaxSize 50 typedef int ElemType; typedef…

算法通过村第八关-树(深度优先)白银笔记|深度和高度问题

文章目录 前言1. 最大深度问题2. 判断平衡树3. 最小深度4. N叉树的最大深度总结 前言 提示&#xff1a;我的整个生命&#xff0c;只是一场为了提升社会地位的低俗斗争。--埃莱娜费兰特《失踪的孩子》 这一关我们看一些比较特别的题目&#xff0c;关于二叉树的深度和高度问题。这…

ORA-00257:archiver error.Connect internal only,until freed.

ORA-00257:archiver error.Connect internal only,until freed. 1、报错原因 归档满了2、解决方法 1.查看归档路径 archive log list;Arcive destination USE_DB_RECOVERY_FILE_DEST此参数代表归档存放路径&#xff0c;本地存放为/opt/oracle…&#xff0c;asm为archdg …

保姆级式教程:教你制作电子画册

在这个数字化时代&#xff0c;电子画册成为了展示和分享作品的一种流行方式。制作一个精美的电子画册不仅可以展示你的创意和才华&#xff0c;还可以吸引更多人的关注和欣赏。下面告诉大家一些小步骤&#xff0c;带你一步步学习如何制作电子画册。 1.收集和整理作品 接下来&am…

ICS TRIPLEX T8151B 数字量输入模块

ICS TRIPLEX T8151B 是一种数字量输入模块&#xff0c;通常用于工业控制和自动化系统中&#xff0c;用于监测和采集数字输入信号&#xff0c;例如开关状态、传感器状态或离散信号。以下是可能包括在 ICS TRIPLEX T8151B 数字量输入模块中的一些常见产品功能&#xff1a; 数字输…

全局异常处理+JSR303验证

一、前言 我们在日常开发中&#xff0c;避不开的就是参数校验&#xff0c;有人说前端不是会在表单中进行校验的吗&#xff1f;在后端中&#xff0c;我们可以直接不管前端怎么样判断过滤&#xff0c;我们后端都需要进行再次判断&#xff0c; 为了安全 。因为前端很容易拜托&…

Chemdraw 使用小技巧

Chemdraw 快速画分子结构 Chemdraw中有个join 功能&#xff0c;可将多个分子快速的连接在一起&#xff0c;还有group以及ungroup 功能也可以快速实现。Chemdraw画布太小&#xff0c;利用page-document settings, Layout-Poster&#xff0c;修改height, widthChemdraw快速创建新…

C语言练习题解析(4)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

Flink-CDC 抽取SQLServer问题总结

Flink-CDC 抽取SQLServer问题总结 背景 flink-cdc 抽取数据到kafka 中&#xff0c;使用flink-sql进行开发&#xff0c;相关问题总结flink-cdc 配置SQLServer cdc参数 1.创建CDC 使用的角色, 并授权给其查询待采集数据数据库 -- a.创建角色 create role flink_role;-- b.授权…

el-upload 上传附件(拆解步骤)

目录 1. 看elementui /element-plus 官网案例 2. html部分&#xff1a; 把官网上的搬下来&#xff0c;最好加一个按钮&#xff0c;上传到服务器&#xff08;后端&#xff09; 3. js 部分&#xff1a; 3.1 首先&#xff0c;先定义一个变量&#xff0c;files 3.2 当上传图片…

数据结构学习笔记—— 排序算法总结【ヾ(≧▽≦*)o所有的排序算法考点看这一篇你就懂啦!!!】

目录 一、排序算法总结&#xff08;一&#xff09;排序算法分类&#xff08;二&#xff09;表格比较 二、详细分析&#xff08;最重要考点&#xff01;&#xff01;&#xff01;&#xff09;&#xff08;一&#xff09;稳定性&#xff08;二&#xff09;时间复杂度&#xff08;…

数据结构与算法(三)——递归

一、递归的概念 递归就是方法自己调用自己&#xff0c;每次调用时传入不同的变量。 递归有助于编程者解决复杂的问题&#xff0c;同时可以让代码变得简洁。 1.1 递归机制 递归调用规则&#xff1a; 1>当程序执行到一个方法时&#xff0c;就会开辟一个独立的空间&#xff0…