以上f(i,1) à i1中,如果程序中没有i1的定义,或者通过f(1,i)构成1i,则即便是通过了宏替换,也不能编译通过。--------------------------------------------------------------------------------日常实践中,##是常用的替换。尤其在通过C的函数指针来模拟动态绑定时大有用处。
下面是从stackoverflow(具体id记不清了)上摘取的一个例子。struct command { char *name; void (*function) (void); }; struct command commands[] = { { "quit", quit_command }, { "help", help_command }, ... };构造一个这样的commands数组,是为了在后续的设计中,可以通过交互式的字符串输入,来动态地执行相应的函数。字符串自身作为前缀,”_command”作为后缀。手工构造这样第一个commands数组显得非常冗余,还容易造成不必要的拼写错误。下面来看看这个宏替换版本。#define COMMAND(NAME) { #NAME, NAME ## _command } struct command commands[] = { COMMAND (quit), COMMAND (help), ... };清晰了很多!C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htmC++11 获取系统时间库函数 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htmC++11中正则表达式测试 http://www.linuxidc.com/Linux/2012-08/69086.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-06/102921.htm