当前位置: 首页 > news >正文

#与##的用法

#

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

#的作用:是在形参左右各加双引号,使它变成字符串。#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.lryc.cn/news/169414.html

相关文章:

  • Flutter的路由router-页面跳转
  • 24v转5v稳压芯片-5A大电流输出ic
  • Layui + Flask | 表单元素(组件篇)(06)
  • Kakfa - Producer机制原理与调优
  • 基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真
  • opencv 基础(持续更新中)
  • 科普现场!万博智云参加第五届张江汇智科普节
  • 【记录】实现从Linux下载下载文件(文件导出功能)并记录过程产生的BUG问题。
  • 可扩展性表设计方案
  • Scotch: Combining SGX and SMM to Monitor Cloud Resource Usage【TEE的应用】
  • 腾讯mini项目-【指标监控服务重构】2023-08-19
  • go实现grpc-快速开始
  • linux上的init 0-6指令作用以及一些快捷键和系统指令
  • Mixin 混入
  • pycharm快捷键
  • 【面试刷题】——Linux基础命令
  • 第四步 Vue2 配置ESLint
  • [.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试
  • 【单线图的系统级微电网仿真】基于 PQ 的可再生能源和柴油发电机组微电网仿真(Simulink)
  • 人脸识别技术应用安全管理规定(试行)|企业采用人脸打卡方式,这4条规定值得关注
  • leetcode 817. 链表组件(java)
  • 分布式事务基础理论
  • 《打造高可用PostgreSQL:策略与工具》
  • 【八大经典排序算法】快速排序
  • vue 父组件给子组件传递一个函数,子组件调用父组件中的方法
  • docker 获取Nvidia 镜像 | cuda |cudnn
  • uTool快捷指令
  • R reason ‘拒绝访问‘的解决方案
  • 许战海战略文库|品类缩量时代:制造型企业如何跨品类打造份额产品?
  • BIT-4-数组