C/C++知识点之C语言中定义变量“#X”,”X##”, “##X” 和“##X##”解析
小标 2018-11-01 来源 : 阅读 1491 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言中定义变量“#X”,”X##”, “##X” 和“##X##”解析,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言中定义变量“#X”,”X##”, “##X” 和“##X##”解析,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

关于#和##

在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:
1. #使用
#define WARN_IF(EXP) /
  do{ if (EXP) /
  fprintf(stderr, "Warning: " #EXP "/n"); } /
  while(0)
那么实际使用中会出现下面所示的替换过程:
WARN_IF (divider );  其中divider == 0
  被替换为

do {

  if (divider == 0)

  fprintf(stderr, "Warning" "divider == 0" "/n");

} while(0);

这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。
2. ##使用
而## 被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用:

struct command

{

  char * name;

  void (*function) (void);

};

#define COMMAND(NAME) { NAME, NAME ## _command }  此处的##表示后面有内容与NAME链接 
// 然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了:

struct command commands[] = {

  COMMAND(quit),

  COMMAND(help),

  ...

}

COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误。我们还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。比如:
#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d //注意这里的规则(a##开头,##d结束,中间都用##x##)
typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);
// 这里这个语句将展开为:
// typedef struct _record_type name_company_position_salary;
 
个人认为##类似 运算符+ 起到连接的作用。
 
3 再看一个#使用如下:

#define display(name) printf(""#name"") 
int main() { 
  display(name); 
}

运行结果是name,为什么不是"#name"呢? ---------------------------------------------------------------
#在这里是字符串化的意思 printf(""#name"") 相当于 printf("" "name" "")

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程