c/c++的预处理定义:
一。Stringizing Operator (#)
在c和c++中数字标志符#被赋予了新的意义,即字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来
参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
如:
 #define example(instr) printf("the input string is:/t%s/n",#instr)
 #define example1(instr) #instr
当使用该宏定义时:
example(abc); 在编译时将会展开成:printf("the input string is:/t%s/n","abc");
string str=example1(abc); 将会展成:string str="abc";

注意:
1。对空格的处理
a。忽略传入参数名前面和后面的空格。
如:str=example1(   abc  ); 将会被扩展成  str="abc";
b.当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串中只以一个空格连接,忽略其中多余一个的空格。
如:str=exapme( abc    def); 将会被扩展成  str="abc def";

2。转义字符
a. 某些形式的传入参数名中,若存在特殊字符,编译器会自动为其添加转义字符号'/'。
如:
string str=example1("escap'/e"); 相当于:str="/"escap/'//e/"";
b. vc6.0和vc7.0并不能正确的解析所有需要特殊字符的情况。此时会给出错误报告:error C2001: 常数中有换行符。
如:
example1(abc/'); //此处报警 error C2001: 常数中有换行符

二。Charizing Operator (#@)
字符化操作符。其同样只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用,将传的单字符参数名转换成字符,以一对单引用括起来。
如:
#define exampleChar(inchar) #@inchar
使用该宏定义:
char a=exampleChar(a); 将会被扩展成:char a='b';

注意:
vc6.0和vc7.0中默认的类型转换中,可以将int截断成char。因此,参数名中最多不能超过4个字符。
如:
char a=example(abcd) 将会截断成  a='d'。同时编译器会给出:warning C4305: “=” : 从“int”到“char”截断

三。Token-Pasting Operator (##)
##:符号连接操作符。
宏定义中:参数名,即为形参,如#define sum(a,b) (a+b);中a和b均为某一参数的代表符号,即形式参数。
而##的作用则是将宏定义的多个形参成一个实际参数名。
如:
#define exampleNum(n) num##n
int num9=9;
使用:
int num=exampleNum(9); 将会扩展成 int num=num9;

注意:
1.当用##连接形参时,##前后的空格可有可无。
如:#define exampleNum(n) num ## n 相当于 #define exampleNum(n) num##n
2.连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。

转载于:https://www.cnblogs.com/azbane/p/8916627.html

c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)相关推荐

  1. warning C4552: '' : operator has no effect; expected operator with side-effect

    1>编写一个自定义的函数shift_right:利用引用形参实现对一个int型的数据右移n位. 代码如下: #include<iostream> using namespace st ...

  2. What are TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR (etc.)?

    2019独角兽企业重金招聘Python工程师标准>>> http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR- ...

  3. 从零写一个编译器(九):语义分析之构造抽象语法树(AST)

    项目的完整代码在 C2j-Compiler 前言 在上一篇完成了符号表的构建,下一步就是输出抽象语法树(Abstract Syntax Tree,AST) 抽象语法树(abstract syntax ...

  4. c++ Macros

    ## 操作符: https://www.cprogramming.com/reference/preprocessor/token-pasting-operator.html ## macro ope ...

  5. python学习-元组tuple(定义、删除、长度、复制、查找、遍历、operator,和列表的区别)

    元组tuple 元组的创建 元组的使用 使用进阶 元组和列表的区别 元组的创建 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组的创建,使用()或在定义变量以后添加一个逗号(,) ...

  6. VC预处理指令与宏定义的妙用

    VC中预处理指令与宏定义的妙用 刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预 ...

  7. 宏定义中的 ## ... __VA_ARGS__

    宏定义中的##操作符和... and _ _VA_ARGS_ _ 1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operat ...

  8. C++ 预处理与宏相关编程(#,##等等)

    一.简介引言 C++ 模板元编程 (template metaprogramming) 虽然功能强大,但也有 局限性: 不能通过 模板展开 生成新的 标识符(identifier).例如:生成新的 函 ...

  9. U1C2 文本预处理

    U1C2 Text pre-processing 一.正则表达式 - Regular Expressions 1.基本正则表达式模式 Basic Regular Expression Patterns ...

  10. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

最新文章

  1. 网站颜色搭配的好网站。
  2. python 指定证书验证_如何在python中验证SSL证书?
  3. DirectionalLayout线性布局
  4. 光纤收发器让网络布线变的更方便
  5. vmware workstation17环境安装centos7
  6. 我的服装DRP之开发感悟
  7. DotNetBar 6.6.0.1 Crack
  8. 互联网产品需求管理思考——统一需求管理
  9. 《庄子·胠箧》:“彼窃钩者诛,窃国者为诸侯;诸侯之门而仁义存焉。”
  10. 计算机等级考试准考证打河南,2019年河南牧院计算机等级考试准考证打印时间...
  11. 哈拉德·柯施纳的狡猾
  12. cannot use message (variable of type protoreflect.ProtoMessage) as type protoiface.MessageV1 in argu
  13. Unity入门常见错误之碰撞检测方法无法触发
  14. 一款实用免费的日志自动化分析工具
  15. 也许有那么一天你会发现原来自己是个怪人
  16. matlab从大到小排序的语句,从小到大排序的方法
  17. 华为从服务器获取安装包信息失败,华为系统恢复获取安装包信息失败
  18. 从“增信”到“征信”:互联网金融时代的中国个人征信体系发展
  19. 51CTO学院 c++视频
  20. SD卡与MMC卡的区别

热门文章

  1. AWS披露面向Amazon S3的AI监控方案
  2. RabbitMQ之前的那些事
  3. BZOJ 3675 APIO2014 序列切割 斜率优化DP
  4. Delphi 与 DirectX 之 DelphiX(15): TPictureCollectionItem.DrawWaveX、DrawWaveY ...
  5. Centos5.8升级SSH到5.8p2
  6. 我的博客之[网管日志]
  7. 来我们公司面试必问的41道 SpringBoot 面试题,不看亏大了!
  8. Spring Cloud 微服务下的权限解决方案
  9. 某生鲜平台面试题:如何保证库存在高并发的场景下是安全的?
  10. Redis百亿级Key你用过吗?