From: http://bluefairy218.blog.163.com/blog/static/313917532008456397524/
 
#是生成字符串:
           #define a(x) #x
           a(bc) => "bc"
 
 ##是连接:
           #define a(x) abc##x
           a(123) => abc123
 
 #error是生成编译错误消息:
 
           #ifdef abc
                 #error something wrong...
           #endif
           //如果abc是已经定义的宏,那么编译的时候就会显示错误消息something wrong...
#error的作用,个人觉得是,让错误尽可能在编译阶段就被发现,并改正,这样可以减少出错成本,因为错误的发现和解决,越到后期,发现的难度,解决的成本,就越高。