在本文中,我们将讨论如何编写多行宏。我们可以编写类似于函数的多行宏,但每个语句都以“”结尾。让我们举个例子看看。下面是一个简单的宏,它接受用户输入的数字,并打印输入的数字是偶数还是奇数。
null
#include <stdio.h> #define MACRO(num, str) { printf ( "%d" , num); printf ( " is" ); printf ( " %s number" , str); printf ( "" ); } int main( void ) { int num; printf ( "Enter a number: " ); scanf ( "%d" , &num); if (num & 1) MACRO(num, "Odd" ); else MACRO(num, "Even" ); return 0; } |
乍一看,代码看起来不错,但当我们试图编译这段代码时,它给出了编译错误。
[narendra@/media/partition/GFG]$ make macro cc macro.c -o macro macro.c: In function ‘main’: macro.c:19:2: error: ‘else’ without a previous ‘if’ make: *** [macro] Error 1 [narendra@/media/partition/GFG]$
让我们看看我们在编写宏时犯了什么错误。我们用大括号把宏括起来。根据C语言规则,每个C语句都应该以分号结尾。这就是为什么我们用分号结束宏。这是一个错误。让我们看看compile如何扩展这个宏。
if (num & 1) { ------------------------- ---- Macro expansion ---- ------------------------- }; /* Semicolon at the end of MACRO, and here is ERROR */ else { ------------------------- ---- Macro expansion ---- ------------------------- };
我们用分号结束宏。当编译器展开宏时,会在“if”语句后加上分号。由于“if和else语句”之间有分号,编译器会给出编译错误。如果我们忽略“else”部分,上述程序将正常工作。
为了克服这个限制,我们可以将宏括在“do while(0)”语句中。我们修改后的宏将如下所示。
#include <stdio.h> #define MACRO(num, str) do { printf ( "%d" , num); printf ( " is" ); printf ( " %s number" , str); printf ( "" ); } while (0) int main( void ) { int num; printf ( "Enter a number: " ); scanf ( "%d" , &num); if (num & 1) MACRO(num, "Odd" ); else MACRO(num, "Even" ); return 0; } |
编译并运行上面的代码,现在这段代码可以正常工作了。
[narendra@/media/partition/GFG]$ make macro cc macro.c -o macro [narendra@/media/partition/GFG]$ ./macro Enter a number: 9 9 is Odd number [narendra@/media/partition/GFG]$ ./macro Enter a number: 10 10 is Even number [narendra@/media/partition/GFG]$
我们将宏包含在“do–while(0)”循环中,在while结束时,我们将条件设置为“while(0)”,这就是为什么这个循环只执行一次。
类似地,我们可以将多行宏括在括号中,而不是“do–while(0)”循环。我们可以用这个技巧达到同样的效果。让我们看看例子。
#include <stdio.h> #define MACRO(num, str) ({ printf ( "%d" , num); printf ( " is" ); printf ( " %s number" , str); printf ( "" ); }) int main( void ) { int num; printf ( "Enter a number: " ); scanf ( "%d" , &num); if (num & 1) MACRO(num, "Odd" ); else MACRO(num, "Even" ); return 0; } |
[narendra@/media/partition/GFG]$ make macro cc macro.c -o macro [narendra@/media/partition/GFG]$ ./macro Enter a number: 10 10 is Even number [narendra@/media/partition/GFG]$ ./macro Enter a number: 15 15 is Odd number [narendra@/media/partition/GFG]$
本文由 纳伦德拉·康拉尔卡 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END