c语言宏定义的连接符有哪些

[此问题的推荐答案]

(一)宏定义中的## 连接符与# 符

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。

假设程序中已经定义了这样一个带参数的宏:

#define paster( n ) printf( "token" #n " = %d", token##n )

同时又定义了一个整形变量:

int token9 = 9;

现在在主程序中以下面的方式调用这个宏:

paster( 9 );

那么在编译时,上面的这句话被扩展为:

printf( "token" "9" " = %d", token9 );

注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。

可想而知,上面程序运行的结果就是在屏幕上打印出token9=9

(二)"/"与一个较长占多行的宏

宏定义中允许包含两行以上命令的情形,此时必须在最右边加上"/"且该行"/"后不能再有任何字符,连注释部分都不能有,下面的每行最后的一定要是"/","/"后面加一个空格都会报错,更不能跟注释。

#define exchange(a,b) {/

int t;/

t=a;/

a=b;/

b=t;/

}

经常使用_T()宏,它是怎么来的?用VA看了一下,原来_T是__T

#define _T(x)       __T(x)

再看看__T

在tchar.h中

#ifdef  _UNICODE

#define __T(x)      L ## x

#else

#define __T(x)      x

#endif

那么,这个##是什么呢?原来它是一个连接符,将##左右两边的表达式连接成一个.比如,在_UNICODE环境下,

_T(“Unicode“) == L“Unicode“

不过需要注意的是,宏是由编译器在编译阶段识别的,所以不能指望程序运行时起到连接作用.比如:

int A0, A1, A2, A3;

for (int i = 0; i < 4; i++)

{

A##i = i;

}

这种代码就无法编译了.

c语言宏定义的连接符##和#转字符串相关推荐

  1. C/C++语言宏定义##连接符和符#的使用

    C/C++语言宏定义##连接符和符#的使用     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53113187 (一) ...

  2. c语言中#39;xd#39;代表什么,关于C语言宏定义的技巧:#39;##39;和#39;###39;

    关于C语言宏定义的技巧:'#'和'##' '#'和'##' '#'和'##'是两个预处理运算符,只能在预处理的过程中使用.在带参数的宏定义中, '#'运算符后面应该跟一个参数,预处理器会把这个参数转换 ...

  3. c语言宏定义技巧和用法,关于C语言宏定义的技巧:'#'和'##'

    关于C语言宏定义的技巧:'#'和'##' '#'和'##' '#'和'##'是两个预处理运算符,只能在预处理的过程中使用.在带参数的宏定义中, '#'运算符后面应该跟一个参数,预处理器会把这个参数转换 ...

  4. c语言里宏定义算变量嘛,C语言宏定义的一些总结

    较大的C语言项目都会用大量的宏定义来组织代码,比较经典的代码就是Linux Kernel的头文件中用的宏定义.看起来宏展开就是做个替换而已,其实里面有比较复杂的规则,有关宏展开的语法规则此小结力图整理 ...

  5. 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法

    C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...

  6. c语言宏编译命令大全,C语言宏定义与预编译详解

    http://blog.csdn.net/findaway123/article/details/6994203 2011 1.宏定义和函数的区别 -------------------------- ...

  7. C语言宏定义中#号的作用

    C语言宏定义中#号的作用 前言 #号的作用 前言 最近,在阅读uboot的源码过程中,发现了一段宏定义代码: #define U_BOOT_CMD_MKENT_COMPLETE(_name, _max ...

  8. 转载--c语言宏定义(1)

    作者:独舞风 链接:c语言宏定义(1) 1.为什么要有宏定义? 代码中某个特定数值需要参与运算,而且该数值作用于多个地方,当需要对该数值进行修改时,希望只改动一个地方就能实现该数值的全部更新:即便某个 ...

  9. c语言 宏定义 去除宏定义_如何检查是否在C中定义了宏?

    c语言 宏定义 去除宏定义 To check whether a Macro is defined or not in C language – we use #ifdef preprocessor ...

最新文章

  1. 回归分析中的“回归”
  2. ubuntu mysql登陆_ubuntu mysql 配置 远程登陆
  3. Impala:新一代开源大数据分析引擎--转载
  4. 【数据竞赛】“达观杯”文本智能处理挑战赛6——模型优化
  5. 如何linux查看mysql目录下日志_测试人员如何在linux服务器中查询mysql日志?
  6. 举例说明Java中代码块的执行顺序
  7. Everything是如何搜索的
  8. c++中vector用法(涵盖算法题中知识点)
  9. git tag标签操作
  10. vb adodc连接mysql_VB中用ADODC控件连接ACCESS数据库
  11. gxworks2软件测试对话框,超实用!GX Works2软件的启动与窗口功能应用
  12. 大华sd集成android so库,android平台上集成大华sdk
  13. java中的this是什么意思
  14. 计算机编程入门先学什么最好?
  15. Android 隐藏APP图标
  16. 不平凡的2021,末流普本生秋招上岸大厂的历程
  17. BLE 技术(四)--- 链路层五种通信模式和空口协议设计 (Core_v5.2)
  18. 20【材料】相关专业调剂信息!一直更新!
  19. 数据加解密之Java实现Base64加密
  20. ear的英语怎么念_ears用英语怎么读

热门文章

  1. 小程序html复制,小程序一键在线整站复制方法
  2. 用python爬取网易云音乐歌单列表
  3. 鸿蒙系统和安卓哪个更流畅,鸿蒙系统与安卓系统的区别 鸿蒙系统与安卓系统哪个更好[图]...
  4. 【C语言】扫雷的实现
  5. 电阻学习看这篇就够了
  6. ajax轮询新订单提醒
  7. 关于iOS 中DLog 用法
  8. 选择、操作web元素-2
  9. mysql建立存储过程报错_【松勤教育】MySQL如何创建存储过程
  10. Android 数据库查看工具Stetho使用介绍