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

受欢迎的南昌网站建设扁平化网站设计趋势

受欢迎的南昌网站建设,扁平化网站设计趋势,网站访客记录,优设网的吉祥物C语言的宏系统相当强大,它允许使用##符号来处理预处理期的文本替换。这种用法被称为标记连接(token pasting)操作,其结果是将两个标记紧紧地连接在一起,而省略掉它们之间的所有空格。在复杂的宏定义中,运用…

在这里插入图片描述

C语言的宏系统相当强大,它允许使用##符号来处理预处理期的文本替换。这种用法被称为标记连接(token pasting)操作,其结果是将两个标记紧紧地连接在一起,而省略掉它们之间的所有空格。在复杂的宏定义中,运用##可以有效地生成新的标识符或调整代码的结构。对##符号的深入理解可以帮助编写出更高效、更灵活的代码,但同时也需要注意其可能带来的复杂性和可读性问题。

##运算符,也叫连接运算符(也称胶水运算符),预处理程序把出现在##两侧的参数合并成一个符号,通常用于宏参数的连接。

  1. 基本应用:
    将两个符号连接到一起。
#define ARM_CONNECT(__A, __B)                        __A##__B//如下方式使用这个宏:int ARM_CONNECT(int,5;
//最终被展开为:int int5;
#define uint16Array(name,size) uint16_t  Array##name[size];
//如下方式使用这个宏:uint16Array(UartTx,128;
//最终被展开为:uint16_t  ArrayUartTx[128];

说明:
Array与name是没有天然的分割的,要将Array于name所代表的内容粘结在一起,就需要使用“##”运算符的帮助。
name与“[”具有天然分隔的,编译器不会认为"name"与"[“是连接在一起的,因此这里并不需要使用”##"运算符,如果你这么做了,预编译器会毫不犹豫的告诉你语法错误。
2. 基于C99的扩展应用
一般应用于带可变参数的宏定义中,比如:

//如下宏定义:
#define log(__STRING, ...)    printf(__STRING, __VA_ARGS__)
//我们调用:
log("output\r\n");
log(" Cycle Count : %d", total_cycle_cnt);
//会被展开为:
printf("output\r\n",);
printf(" Cycle Count : %d", total_cycle_cnt);

看似没有问题,注意到一个细节没有?在第一个printf()的最后多了一个",“。虽然有些编译器,例如GCC并不会计较(也许就是一个warning),但是在ANSI-C99标准引入可变参数宏的时候,又贴心了加了一个不那么起眼的语法:当下面的组合出现时 (”,##VA_ARGS"),如果__VA_ARGS__是一个空字符串,则前面的逗号","会一并被删除掉。因此,上面的宏可以改写为:

//如下宏定义:
#define log(__STRING, ...)    printf(__STRING, ##__VA_ARGS__)
//我们调用:
log("output\r\n");
log(" Cycle Count : %d", total_cycle_cnt);
//会被展开为:
printf("output\r\n"); //无可变参数,没有后面的逗号了
printf(" Cycle Count : %d", total_cycle_cnt); //有参数,逗号依旧存在
  1. 结合逗号表达式和##连接符的高级应用
    我们看arm-2d里面大量使用了这种特征,用来给函数提供初始化默认参数。如下:
//定义一个宏
#define arm_2d_scene_watch_init(__DISP_ADAPTER_PTR, ...)                    \__arm_2d_scene_watch_init((__DISP_ADAPTER_PTR), (NULL, ##__VA_ARGS__))
//函数的原型
extern user_scene_watch_t *__arm_2d_scene_watch_init(   arm_2d_scene_player_t *ptDispAdapter, user_scene_watch_t *ptScene);
//调用arm_2d_scene_watch_init(&DISP0_ADAPTER);
//宏被替换为:__arm_2d_scene_watch_init(&DISP0_ADAPTER,NULL); //增加了一个默认参数NULL

如上的代码,在使用宏arm_2d_scene_watch_init的时候,只传递了一个参数,但是最终替换后自动增加了一个参数。怎么做到的呢?
看看逗号表达式: (NULL, ##VA_ARGS)
第一种情况:
__VA_ARGS__为空,那么这个表达是的值就是NULL。
第二种情况:
__VA_ARGS__为非空,那么这个表达的值就是可变参数传递进来的值。

比如,带第二个参数的调用:

//调用arm_2d_scene_watch_init(&DISP0_ADAPTER,&buffer);
//宏被替换为:__arm_2d_scene_watch_init(&DISP0_ADAPTER,&buffer);

文章转载自:

http://PTBKG22g.fwkq.cn
http://azBFc7lp.fwkq.cn
http://ktHFAmPO.fwkq.cn
http://oaJfY68S.fwkq.cn
http://hIq10pWy.fwkq.cn
http://xj7OukJo.fwkq.cn
http://KR5LYLh9.fwkq.cn
http://BmcVSm76.fwkq.cn
http://dTQqMJzm.fwkq.cn
http://exnJg8ch.fwkq.cn
http://SVHiRnX2.fwkq.cn
http://Q2geE3Df.fwkq.cn
http://RxHTbN60.fwkq.cn
http://svGNAMSY.fwkq.cn
http://SxCoa6AC.fwkq.cn
http://mjeLXTfE.fwkq.cn
http://yDX1GbVv.fwkq.cn
http://v96rpu68.fwkq.cn
http://Gzed88kL.fwkq.cn
http://0FDgb1jE.fwkq.cn
http://huNSeY6x.fwkq.cn
http://Bm2zG9GP.fwkq.cn
http://2zvR7nBb.fwkq.cn
http://bbGpvAdi.fwkq.cn
http://23Ee0pKY.fwkq.cn
http://p2I8VNz1.fwkq.cn
http://3KyeiPmw.fwkq.cn
http://HaYJOYlo.fwkq.cn
http://B47rlWDa.fwkq.cn
http://hY1KjPhe.fwkq.cn
http://www.cdong.cn/news/567/

相关文章:

  • 不停弹窗的网站怎么做推广员网站
  • 网站开发游戏程序开发做网站在手机显示怎么很乱
  • 北京社区网站建设wordpress留言板
  • 丰都网站建设好用的wordpress编辑器
  • 一个网站建设多少钱网站asp
  • 珠海建设工程信息网站做招聘的网站有哪些
  • 1685.top贵阳网站建设wordpress文章置顶插件:classic posts
  • 自己怎么申请免费网站什么网站可以查房屋建筑面积
  • 佛山网站优化方法软件网络营销方式和思路
  • 云服务器拿来做网站制作相册影集
  • 网站建设 天台手机和电脑同步的进销存软件
  • 达州北京网站建设如何安装字体wordpress
  • 石狮网站开发网站关键词百度排名在下降
  • 江西住房和城乡建设网站深圳宝安区核酸检测点
  • 蓝色网站wordpress 404跳转
  • 南京做代账会计在哪个网站上找wordpress统计条
  • 泉州市网站建设电脑网站支付
  • 深圳做棋牌网站建设哪家好wordpress电影豆瓣
  • 学做粤菜的网站有哪些龙江人社 pp
  • 淄博网站设计丨致信网络二维码付款跳转网页制作教程
  • 建设营销型网站的目的宁波seo平台
  • 京东商城网站首页公司主页的网站格式
  • 网站建设接活软件技术是做什么的
  • 怎么用网站做类似微博郑州做网站经开区
  • 敦煌网站做外贸怎样国外优秀的网站建设公司
  • php网站制作常用代码wordpress的优缺点
  • 聊城网站设计咨询网络搭建难吗
  • 哪个市文化和旅游网站做的好平台推广公司
  • 福州做网站的网站域名优势
  • 淮北矿业工程建设有限公司网站icp备案网站要先建好吗