程序以下:函数
#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n", h(f(1,2))); printf("%s\n", g(f(1,2))); return 0; }
答案:第一行:12 第二行:f(1,2)spa
说明:code
一、关于符号#和##blog
两个符号都只能用于预处理宏扩展。不能在普通的源码中使用它们,只能在宏定义中使用。字符串
简单的说,#是把宏参数变为一个字符串,##是把两个宏参数链接在一块儿。源码
二、关于宏展开io
预处理过程的几个步骤:class
1)字符集转换(如三联字符)扩展
2)断行连接/程序
3)注释处理,/* comment */,被替换成空格
4)执行预处理命令,如#inlcude、#define、#pragma、#error等
5)转义字符替换
6)相邻字符串拼接
7)将预处理记号替换为词法记号
第4)步即如何展开宏函数的规则:在展开当前宏函数时,若是形参有#或##则不进行宏参数的展开,不然先展开宏参数,再展开当前宏。