华为网站的建设建议,网页设计作品聚散,长沙网建站,阿里云创建网站QQ群(宅学部落)有位学员问了一个很奇怪的宏#xff0c;觉得很有意思#xff0c;特拿来分享#xff0c;它的定义如下:我们知道#xff0c;宏定义其实就是为了方便#xff0c;给一串代码字符串定义一个别名。有时候字符串过于复杂#xff0c;我们可以分多行书写#xff0c…QQ群(宅学部落)有位学员问了一个很奇怪的宏觉得很有意思特拿来分享它的定义如下:我们知道宏定义其实就是为了方便给一串代码字符串定义一个别名。有时候字符串过于复杂我们可以分多行书写然后使用逻辑连接符“\”连接起来表示一个完整的字符串。但是分析上面的宏定义你会发现它分别定义了2个宏但是呢又使用了一对大括号括起来很有欺骗性看起来很像语句表达式但是呢有没有小括号括起来是不是很奇怪调用的时候使用方法更是奇怪如果我们单独使用AA()或BB()调用你会发现编译根本通不过这是为什么呢我们可以使用命令对上面的程序作预处理展开$ gcc -E main.c预处理器对宏定义展开后你会发现会报语法错误但是我们通过AA();BB();这种调用方式呢就可以避免语法错误可以顺利编译通过并运行。这两个有意思的宏要成对出现才能避免程序编译错误如果你只使用了其中一个程序就编译通不过彻底歇菜了。这是谁写的代码啊为什么要这么写其实正是这对宏的有意思之处我们可以稍作封装通过上面的修改你会发现这对宏变成了一对加锁加锁功能可以实现原子操作的临界区功能。而且更巧妙的是这对宏利用了C语法编译检查强制程序员成对使用否则就会报语法编译错误。因此这种强制成对使用也就避免了加锁解锁不成对出现时引起的死锁问题。C语言博大精深任何一段代码仔细分析仔细推敲都有很多编程技巧和精华在里面感觉该学员提出的一个好问题也欢迎更多的学员遇到问题踊跃提问、勤于思考大家一起学习、努力、进步。