#表示:对应变量字符串化

##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符

连接符#@:它将单字符标记符变换为单字符,即加单引号。例如:

#define B(x) #@x

则B(a)即'a',B(1)即'1',但B(abc)却不甚有效。

  1. #include <stdio.h>
  2. #define trace(x, format) printf(#x " = %" #format "\n", x)
  3. #define trace2(i) trace(x##i, d)
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. int i = 1;
  7. char *s = "three";
  8. float x = 2.0;
  9. trace(i, d);                // 相当于 printf("x = %d\n", x)
  10. trace(x, f);                // 相当于 printf("x = %f\n", x)
  11. trace(s, s);                // 相当于 printf("x = %s\n", x)
  12. int x1 = 1, x2 = 2, x3 = 3;
  13. trace2(1);                  // 相当于 trace(x1, d)
  14. trace2(2);                  // 相当于 trace(x2, d)
  15. trace2(3);                  // 相当于 trace(x3, d)
  16. return 0;
  17. }

输出结果:

i = 1
x = 2.000000
s = three
x1 = 1
x2 = 2
x3 = 3

C/C++ 宏定义中#、##、#@的区别的更多相关文章

  1. C/C++宏定义中#与##区别 .

    // #表示:对应变量字符串化// ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 #define U_BOOT_CMD_MKENT_COMPLETE(name,maxa ...

  2. 面试问题5:const 与 define 宏定义之间的区别

    问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同     define宏是在预处理阶段展开:     const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...

  3. 宏定义中的##操作符和... and _ _VA_ARGS_ _

    1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used i ...

  4. define宏定义中的#,##,@#及\符号

    define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (string ...

  5. 宏定义中使用do{}while(0)的好处 (转载)

    宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0)   的格式,总结了以下几个原因:   1,空的宏定 ...

  6. C语言在宏定义中使用语句表达式和预处理器运算符

    语句表达式的亮点在于定义复杂功能的宏.使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞.下面以一个简单的最小值的宏为例子一步步说明. 1.灰常简单的么,使用条件运算符 ...

  7. #define宏定义中## #@ # \ 符号使用

    C/C++ 宏命令的神奇用法. 先看下面三条语句: #define Conn(x,y)     x##y#define ToChar(x)     #@x#define ToString(x)    ...

  8. C语言宏定义中的#和##的作用【转】

    本文转载自:http://my.oschina.net/shelllife/blog/123202 在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串:后者将其前后的两个宏定义中的两个变量无缝 ...

  9. C++宏定义中"#"与"##"的妙用

    在C++开发当中经常用到宏的定义当中使用"#"或者"##",以下是对着两种符号使用方法的简单描述: define中的#就是把#后面的参数当做一个符号来使用,简单 ...

随机推荐

  1. 解决Myeclipse编译不生成.class文件问题

    1.Project --> clean...  如果该操作无效,请执行2. 2.Preferences -->Java -->Compliler -->Building --& ...

  2. Python 微信公众号发送消息

    1. 公众号测试地址 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index 2. ...

  3. something about WinPE系统

    [问]:啥是Win PE系统?做什么用的?和Win7哪个好? [答]:Win PE系统是一个小型系统,一般用特殊工具将Win PE制作在U盘里,电脑110的志愿者们使用它对电脑上原有系统进行修复或是进 ...

  4. 通过IP地址和子网掩码计算主机数

    知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 子网掩码是255·255·255·0.算出 ...

  5. js对象替换键值名称

    js对象替换键值名称 将obj中的id和name字段替换分别替换成为“@id”,“@name” 代码如下: let obj = [{id:,name:,name:"李四"}].ma ...

  6. spawn-fcgi出错处理

    /usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI 添加 ...

  7. MyBatis插入时候获取自增主键方法

    方法一:(Oralce不支持这种写法) useGeneratedkeys 默认值为 false,含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty ...

  8. php打开错误日志

    ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);

  9. Struts2自定义转换器输入生日日期输出年、月、日、年龄

    BirthAction.java package com.action; import java.util.Calendar; import java.util.Map; import com.bea ...

  10. CodeForces 738C Road to Cinema

    二分答案. 油量越多,显然通过的时间越少.可以二分找到最小的油量,可以在$t$时间内到达电影院. 一个油箱容量为$v$的车通过长度为$L$的路程需要的最小时间为$max(L,3*L-v)$.计算过程如 ...