范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C使用宏参和构造有规律的字符串常量标识符常量值

  预处理符号#:可以将宏参粘合成字符串的一部分。
  预处理符号##:可以将宏参粘合成标识符、常量值的一部分。
  通常可以用于构造有规律的字符串、标识符、常量值。#include   #define MACR1(s) #s #define MACR2(a,b)  a##b  int main(void) {     int helloworld = 101;      printf("%s ", MACR1(hello)" world");// hello world,#将宏参粘合成了一个字符串     printf("%d ", MACR2(hello,world)); // 101,##将宏参粘合成了一个标识符     printf("%d ", MACR2(10,1));        // 101,##将宏参粘合成了一个字面值常量     return 0; }
  在 Linux  内核中有一个使用#  和##  的真实案例,通过这个例子可以了解到#  和##  的价值所在。
  (1)没有#和##时的正常做法 #define QDSP_MODULE_AUDPPTASK 1 #define QDSP_MODULE_AUDRECTASK2 #define QDSP_MODULE_UDPREPROCTASK 3  struct adsp_module_info {     const char *name;     const char *pdev_name;     uint32_t id; };  struct adsp_module_info module_info[] = {     {.name="AUDPPTASK", .pdev_name=adsp_AUDPPTASK, .id=QDSP_MODULE_AUDPPTASK},     {.name="AUDRECTASK", .pdev_name=adsp_AUDRECTASK, .id=QDSP_MODULE_AUDRECTASK},     {.name="UDPREPROCTASK", .pdev_name=adsp_UDPREPROCTASK, .id=QDSP_MODULE_UDPREPROCTASK} };
  从这个例子中可以看出,给结构体数组初始化的值的名字很有规律,比如: "AUDPPTASK" adsp_AUDPPTASK QDSP_MODULE_AUDPPTASK_1
  基于这个规律完全可以使用 #  和##  处理,在Linux  内核中确实也是这么做的。
  (2)使用#和##处理后 #define QDSP_MODULE_AUDPPTASK_1 1 #define QDSP_MODULE_AUDRECTASK_2 2 #define QDSP_MODULE_AUDRECTASK_3 3  #define QDSP_MODULE(n) { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n }  struct adsp_module_info {     const char *name;     const char *pdev_name;     uint32_t id; };  struct adsp_module_info module_info[] =  {     QDSP_MODULE(AUDPPTASK),     QDSP_MODULE(AUDRECTASK),     QDSP_MODULE(UDPREPROCTASK) };
  使用 #  和##  修改后,其实代码的执行效率并没有发生变化,但是使用了#  和##  后,确使得源码更加的简洁。
  在Linux  内核、框架的C/C++  源码中,大量充斥着这种用法,希望通过这里的介绍后,大家不再陌生这样的用法。
  如果宏的参数是另一个宏的话,通常需要加一层宏定义,才可以产生预想的效果:  #include   #define NUM 100 #define STR(num) #num #define _STR(num) STR(num)  int main(void) {     printf("%s ", _STR(NUM));     return 0; }
  展开的过程:  _STR(NUM)   STR(NUM)   STR(100)   #100   "100"
  如果没有加的这一层,NUM就没有展开的机会。
  再看##: #include   #define TAG1 info #define TAG2 _teacher  #define STRUCT(a, b) struct a##b #define _STRUCT(a, b) STRUCT(a, b) //加的一层  _STRUCT(TAG1, TAG2) {     int num; }  int main(void) {     return 0; }
  展开的过程: _STRUCT(TAG1, TAG2)   STRUCT(TAG1, TAG2)   STRUCT(info, _teacher)   struct info##_teacher   struct info_teacher
  如果没有加的这一层,TAG1, TAG2就没有展开的机会。
  再看一个##定义结构体的例子: struct info_student  {     char name[30];     int num; }; typedef struct info_student student;struct info_teacher {     char name[30];     int id; }; typedef info_teacher teacher;struct info_administor {     char name[30];     int id; }; typedef struct info_administor administor;
  比如像以上的这些例子,当需要定义好多结构体类型,而且这些结构体类型的格式还非常相似时(有规律可循),我们可以使用 ##  来简化操作,让代码变的更简洁:
  2)使用##简化后 #define STRUCT(type) typedef struct info_##type type;                       struct info_##type  STRUCT(student) {     char name[30];     int num; };  STRUCT(teacher) {     char name[30];     int id; };  STRUCT(administor) {     char name[30];     int id; };  int main(void) {     return 0; }
  预处理后的代码:typedef struct info_student student; struct info_student {     char name[30];     int num; };  typedef struct info_teacher teacher; struct info_teacher {     char name[30];     int id; };  typedef struct info_administor administor; struct info_administor {     char name[30];     int id; };  int main(void) {     return 0; }
  ref
  https://www.hhcycj.com/post/item/382.html
  -End-

你还记得人生第一部手机吗?小编人生的第一步手机是酷派。不知道现在还有多少人知道这个牌子,在当时那个年代,酷派真的是手机的巨头,绝对销量前三,因为那个是一个智能机,当时我那个稀罕啊,真的没见过智能手机。当时开手把手教你更换手机电池,再也不会被手机维修电坑啦手机用3年多时间了,电池充电慢耗电快,有时充满电在刷头条会以肉眼可见的速度在耗电,同时也伴随着发热发烫,我知道手机该换电池了。前几天网购的电池已收到,今晚不加班正好有时间换下,记录五年前的华为诈尸了?突然更新系统?广告更新?一般来说,Android手机的系统更新周期是23年,当然一些旗舰机型可能维持更长时间。近日,华为P9竟突然迎来了系统更新,要知道该机发布至今已有五年时间了,网友戏称为诈尸级更新。官各位跑步大神,作为一个初跑者如何选购一块运动手表,请给点建议?感谢您的阅读!各位跑步大神,作为一个初跑者如何选购一块运动手表,请给点建议?对于我们来说,选择一款手表的重要性是不言而喻的,特别是像我这样特别喜欢运动的用户来说,我觉得如果一款手表惠普战66四代和联想yoga14s哪款更值得买?区别和选购建议帮您惠普战66四代和联想yoga14s都是市面上很受欢迎的轻薄本,很多朋友私信问联想yoga14s和惠普战66四代这两款笔记本哪个更值得入手?下面一起来详细解读下这两款笔记本的区别和选联想衰弱的三大原因爱炒房做手机我们不是中国企业人类没有联想,世界将会怎样?借助这样一句浅显而直白的广告词,联想为全国人民所知,并走向了海外,成为世界第一。但令人意想不到的是,这样一家世界五百强企业,本应成为国人的骄傲,却在近些真快!iOS15。0beta6来了,有新功能上线在8月18日凌晨时段,苹果正式发布iOS15。0beta6系统,该系统版本为内测版,并不是正式版系统,不过!这次推送速度有点快,离上一个内测仅相隔七天时间,而公测版明天发布。除了i目前值得入手的三款旗舰机,颜值高拍照强,发烧友都很爱用进入到八月份下旬,手机市场非常热闹,这个月有多款年度旗舰登场,但定位都很高端,价格自然不会低,对于大部分用户而言并不友好,那现在又有哪些值得入手的旗舰机,笔者今天就给大家推荐下面这降或者不降?这四款冷门旗舰机神仙打架,谁来给它们买账?市面许多手机角逐时,这几款手机默默无闻但是又各领风骚。除了各大热门旗舰手机以外,这些冷门旗舰其实也很有特色,它们会为了迎合市场而降价吗?让我们一起来盘点一下。坚果R2坚果这个牌子可刻不容缓!市值蒸发千亿,留给拼多多的时间不多了拼多多半年股价跌幅50,市值蒸发千亿有这样的一些公司,它们一直亏损,想要用补贴的方式来获得用户规模。但最终他们还是要想办法让市场看到,他们可以通过创造价值来实现盈利。在财报电话会上微信又悄悄上线新功能!你发现这些新功能了吗?众所周知,微信总是会不定期的更新,然后给用户带来一些新奇的小功能,近期,微信再次迎来了更新,并偷偷上线了一个名为边写边译的功能,快来看看是怎么回事。这个功能隐藏在微信聊天界面,顾名
未来已至MIX4主观体验报告2016年10月25日,小米MIX发布2021年8月10日,小米MIX4发布5年时间,这部MIX4是当初我梦想中的那块玻璃吗?使用MIX4也一个多月了,谈一谈MIX4在我这的使用感银行发来短消息给你授信几十万元,这样的信息可信吗?如果你轻易相信了这种信息,那才是麻烦的开始。相信很多人都接到类似的信息某某银行尊敬的客户,我司授予你198000元,将于某年某月到期,可用于日常消费房屋装修生意拥挤,查利率回1,申MindSporeMindInsight安装UbuntuMindSporeMindInsight安装UbuntuMindSpore介绍和安装缘由MindSpore是华为开源自研AI框架,类似于Pytorch和Tensorflow。因为任为什么建议买高配千元机,也不要买低配的旗舰机?这3点容易忽略大家在选择适合自己的手机时有时候会犯难,到底是选择高配的千元机还是选择低配的旗舰机。这里先给大家一个明确的答案建议选择高配的千元机。因为这三点原因,是大家很容易忽略的。高配千元机实缺芯潮下全球芯片代工巨头业绩暴涨台积电2021年营收破3600亿元本报记者谢岚在市场对芯片的强劲需求推动下,1月13日下午,全球芯片代工巨头台积电公布了一份令人瞩目的业绩报告。2021年全年,台积电实现营收1。587万亿新台币(约合3664亿元人骁龙8旗舰只卖3199元,还有5000mAh电池!性价比厂商难堪了安卓行业的竞争已经超过10年的时间,而我刚好见证了这10年手机市场的风起云涌和跌宕起伏。小米品牌就是智能手机发展最好的镜子,从1999元的小米1到开创全面屏时代的MIX,性价比和全2022年Web3的十大不确定性(上)不确定性是加密行业的最大魅力所在,也让Web3变得极具想象力。从1989年伯纳斯(TimBernersLee)提出万维网概念至今,互联网产业已经历过Web1与Web2两个惊涛骇浪的华为手机丢了怎么办1在电脑上或别的机器设备电脑浏览器上登陆cloud。huawei。com,或在另一部华为荣耀手机上登陆搜索我的微信运用。2精准定位机器设备。开启搜索我的微信精准定位取得成功后,随后倪光南最辉煌的时光是不是和柳传志的那段蜜月期?我感觉不是,那只是倪光南院士研发之路的开始,若是中科院能够支持倪光南院士,在倪光南院士告发柳传志侵吞国有资产的时候支持倪光南院士,然后,联想让支持研发之路的真正企业家管理,相信倪光一加骁龙8新机发布,这次iPhone赢麻了?就在昨天下午,年前最后一款骁龙8新机,一加10Pro也发布了。一加作为OPPO的子品牌,一直处于比较尴尬的地步,主打国外市场时一直是只做旗舰机型的,一加7系列也曾凭借令人称道的屏幕最强小屏旗舰s21骁龙888处理器三星粉优点解析优点1。小屏手感好,颜值高,边框窄。屏幕最强优点2。摄像头凸起的很少,后盖的熟料磨砂很好,比以前玻璃老是留指纹要擦舒服多了,120hz明显提升体验感,日常通勤一天电量没问题,加密的