C宏展开的几个注意事项】的更多相关文章

前阵子仔细重新研究了一下C的宏展开.总结起来,有以下几个主要规则: 每次宏展开的结果会被重复扫描,直到没有任何可展开的宏为止. 每展开一个宏,都会记住这次展开,在这个宏展开的结果及其后续展开中,不再对相同的宏做展开. 带参数的宏,先对参数做展开,除非宏定义体中包含#或## a) #表示将后续标识符转换为字符串 b) ##表示将两个标识符连接成一个标识符 c) 注意参数展开的结果中即使有逗号(,),也不视为参数的分隔符 如果宏定义中带有参数,而代码中出现同样标识符时没有参数,不视为宏. 下面的三段…
C中宏展开问题 简单记录一下碰到的问题. #define STR(x) #x 我们知道使用上面的宏可以将x转换为字符串"x". 但是如果这样用: #define NUM 3 #define STR(x) #x STR(NUM) --> 实际输出为:"NUM". 这是为啥呢?C99标准中有一段话: ... After the arguments for the invocation of a function-like macro have been ident…
转自一个C语言宏展开问题 一个令人比较迷惑的问题,学C语言好多年,今天终于搞明白,记之. ------------------------------------------------------------- #define cat(x,y)  x ## y #define xcat(x,y) cat(x,y) cat(cat(1,2),3) //为什么不是 123? xcat(xcat(1,2),3) //结果为什么是 123? ------------------------------…
1. #include   包含头文件 2.define 宏定义(可以理解为替换,不进行语法检查) 写法 #define 宏名 宏体  加括号 #define ABC (5+3) #define ABC(x)  (5+(x))   宏函数 3. #ifdef  #else  #endif 条件编译 技巧性比较强! 代码分为 调试版本:根据条件来判断是否需要编译debug信息 gcc -D宏名 -o build 001.c 发行版本 4. 预定义宏(系统已经定义) (2个下划线)下面用于调试和开发…
------------------------------------------------- 在编程使用宏替换时,当字符串中不只一个符号时,加上括号表现出优先级, 如果是带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号. ----------------------------------------------------- #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但在学习时往往不…
宏定义 宏定义是对一些常见的变量.字符串等进行定义,被定义的数据在编译会进行自动替换.有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只需要对定义进行一次修改,就可以实现批量修改,提高效率,或者有时有些数字或字符需要多次输入,而数字或字符又不是很规律时,输入就会比较繁琐且容易出错.通过宏义将为输入和维护带来便利. 定义的格式 #define 标识符 字符串 其中的“#”表示这是一条预处理命令.凡是以“#”开头的均为预处理命令.“de…
本文是Linux系统调用专栏系列文章的第一篇,对Linux系统调用的定义.基本原理.使用方法和注意事项大概作了一个介绍,以便读者对Linux系统调用建立一个大致的印象. 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们.从某种角度来看,系统调用和普通的函数调用非常相似.区别仅仅在于,系统调用由操作系统核心提供,运行于核心态:而普通的函数调用由函数库或用户自己提供,运行于用户态.二者在使用方式上也有相似之处,…
问题描述:C语言 预处理包括哪些操作 C语言的三种预处理包括:宏定义(#define).文件包含(#include).条件编译(#if.#else.#endif). 对于宏定义的介绍: 宏定义必须写在函数外,其作用域为宏定义起到源程序结束.C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”.被定义为宏的标识符称为“宏名”.在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏替换或宏展开. 无参宏的宏名后不带参数.其定义的一般形式为: #define  标识符  字…
第五章 循环和关系表达式 1. 2.类别别名: (1)   #define FLOAT_POINTER float * FLOAT_POINTER pa, pb; 预处理器置换将该声明转换成  float * pa, pb: // pa 是指针,pb就是一个float (2)  typedef char byte 不会出现上述问题是最佳的选择 3.  cin.get(name, arSize).get() // 输入长度为arSize的name接受换行 // 发送给cin的输入被缓冲.这意味着只…
1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co…