拾遗笔记

c中的宏

#与##在宏定义中的--宏展开
#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))); // 12
  printf("%s\n", g(f(1,2))); // f(1,2)
  return 0;
}

"#" 与"##" 是宏中两个特殊的符号
"##"相当于连字符,即java中进行字符串连接的加号,sqlplus 中的|| 如a##b##c 等同于 "abc"
而#用来控制是否展开宏,下面详解.

另外几个更复杂的例子
printf("%s\n", h(f(1,2))); // 12
  printf("%s\n", g(f(1,2))); // f(1,2)
  printf("%s\n", g(h(f(1,2)))); // h(f(1,2))
  printf("%s\n", h(g(f(1,2)))); // "f(1,2)"
  printf("%s\n", h(h(f(1,2)))); // "12"

总而言之,先展开参数,再展开自身. 遇#则停
另外,如果验证结果gcc 可以加 -E 选项

gcc -E macro.c
或
gcc -E macro.c -o macro.i

Comments

comments powered by Disqus