4.##运算符
  ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:
  #define NUM(a,b,c) a##b##c
  #define STR(a,b,c) a##b##c
  main()
  {
  printf("%d ",NUM(1,2,3));
  printf("%s ",STR("aa","bb","cc"));
  }
  后程序的输出为:
  123
  aabbcc
  千万别担心,除非需要或者宏的用法恰好和手头的工作相关,否则很少有程序员会知道##运算符。绝大多数程序员从来没用过它。
  三、条件编译指令
  条件编译指令将决定那些代码被编译,而哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。
  1.#if指令
  #if指令检测跟在制造另关键字后的常量表达式。如果表达式为真,则编译后面的代码,知道出现#else、#elif或#endif为止;否则不编译。
  2.#endif指令
  #endif用于终止#if预处理指令。
  #define DEBUG 0
  main()
  {
  #if DEBUG
  printf("Debugging ");
  #endif
  printf("Running ");
  }
  由于程序定义DEBUG宏代表0,所以#if条件为假,不编译后面的代码直到#endif,所以程序直接输出Running。
  如果去掉#define语句,效果是一样的。
  3.#ifdef和#ifndef
  #define DEBUG
  main()
  {
  #ifdef DEBUG
  printf("yes ");
  #endif
  #ifndef DEBUG
  printf("no ");
  #endif
  }
  #if defined等价于#ifdef; #if !defined等价于#ifndef
  4.#else指令
  #else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,编译#else后面的代码。#endif指令将中指上面的条件块。
  #define DEBUG
  main()
  {
  #ifdef DEBUG
  printf("Debugging ");
  #else
  printf("Not debugging ");
  #endif
  printf("Running ");
  }
  5.#elif指令
  #elif预处理指令综合了#else和#if指令的作用。
  #define TWO
  main()
  {
  #ifdef ONE
  printf("1 ");
  #elif defined TWO
  printf("2 ");
  #else
  printf("3 ");
  #endif
  }
  程序很好理解,后输出结果是2。
  6.其他一些标准指令
  #error指令将使编译器显示一条错误信息,然后停止编译。
  #line指令可以改变编译器用来指出警告和错误信息的文件号和行号。
  #pragma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。