(1)在使用宏定义时可以像一个独立的语句一样使用,而不会产生语法上的问题。 (2)使用 do-while 结构也可以避免一些潜在的错误,例如在宏定义中使用 if 和 else 结构时可能会产生错误的语法解析。 (3)需要注意的是,do-while 结构中的循环条件始终为 false(0),因此代码块只会被执行一次。 (4)让程序更加美观,...
与#运算符类似,##运算符可用于函数式宏的替换部分,它把两个记号组合成一个记号。例如,可以这样定义函数式宏: #define XNAME(n) x ## n 然后,展开宏XNAME(4)为x4。 记号黏结的作用是将几个预处理记号合并为一个。在一个函数式宏定义中,如果一个预处理记号的前面或者后面有"##",则该记号将与它前面或者...
➤ 宏定义中的特殊宏 一般在C++中,有如下常用内置宏定义(不是全部的内置宏定义,且不同框架也会有所拓展): ① __FILE__ 当前源文件的路径名称; ② __FUNCTION__ 函数名称(包含类作用域),这里需要注意的是,如果是类的成员函数,还会将类名也打印,以标识作用域,形如:MyClass::Func; ③ __func__ 函数...
在宏定义中引用是指在宏定义的过程中使用其他宏定义。宏定义是一种在编译预处理阶段进行的文本替换机制,可以将一段代码或者表达式定义为一个宏,并在程序中多次使用该宏来实现代码的复用和简化。 在宏定义中引用其他宏可以通过在宏定义的替换部分使用已定义的宏名称来实现。当编译器在预处理阶段遇到宏定义时,会将宏...
例如,可以这样定义函数式宏: #define XNAME(n) x ## n 然后,展开宏XNAME(4)为x4。 记号黏结的作用是将几个预处理记号合并为一个。在一个函数式宏定义中,如果一个预处理记号的前面或者后面有"##",则该记号将与它前面或者后面的记号合并,如果该预处理记号是宏的形参,则用实参执行合并。例如:...
#运算符 宏定义可以包含两个专用的运算符:#和##。编译器不会识别这两个运算符,他们会预处理时被执行。 #运算符将宏的一个参数转换为字符串字面量。它仅允许出现在带参数的宏的替代列表中。(#运算符所执行的操作可以理解为“字符串化(stringization)”). #运算符有许多用途
但是,如果一个函数被封装在了宏定义中,并且,还要在宏定义之外 获取这个函数的返回值 ,应当如何做呢? 2. 实现方法 有两种实现方法: 在宏定义中使用在宏定义之外预先定义的变量; 利用宏定义的特殊格式——登录后复制({x; y; z;})。 2.1 “全局”变量 我们可以 预先定义一个变量 ,在宏定义函数中直接使用。
在上面的示例中,我们定义了一个宏 paster(n),其作用是输出 token 后面紧跟着的 n 的值。具体实现时,我们使用了 # 操作符将 n 转换为字符串,并与 "token " 和 " = %d\n " 组合在一起,形成一个完整的字符串。而在实际执行时,由于 n 的值为 9,因此最终输出为 "token 9 = 10"。
解析 1) 宏名通常用大写字母定义。 2) 在定义宏时, 和 之间要用空格分开。 中的内容不要有空格。 3) 对程序中用双引号括起来的字符串,如果其中有与宏名相同的部分,是不进行文本替换的。 4) 宏定义可以嵌套。 5) 在 C++ 语言中,常用 const 型数据代替宏定义。
宏定义语句连接符 \ : 在C/C++宏定义中规定,宏定义只允许写在同一行,下一行就不属于这个宏定义了,而实际定义宏过程中,经常会出现较复杂的宏定义,较长,写在一行不易于读懂,需按逻辑关系断行编写,此时需要在行的末尾用连接符“\”进行连接,表示上下行属于同一行,即同属于这个宏定义。