C语言中的多行宏

在本文中,我们将讨论如何编写多行宏。我们可以编写类似于函数的多行宏,但每个语句都以“”结尾。让我们举个例子看看。下面是一个简单的宏,它接受用户输入的数字,并打印输入的数字是偶数还是奇数。

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
喜欢就支持一下吧
点赞14 分享