📜  C中的多行宏

📅  最后修改于: 2021-05-25 19:56:54             🧑  作者: Mango

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

#include 
  
#define MACRO(num, str) {\
            printf("%d", num);\
            printf(" is");\
            printf(" %s number", str);\
            printf("\n");\
           }
  
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语句均应以分号结尾。这就是为什么我们用分号结束了MACRO的原因。这是一个错误。让我们看看编译如何扩展此宏。

if (num & 1)
{
    -------------------------
    ---- Macro expansion ----
    -------------------------
};    /* Semicolon at the end of MACRO, and here is ERROR */

else 
{
   -------------------------
   ---- Macro expansion ----
   -------------------------

};

我们以分号结束了宏。当编译器扩展宏时,它将分号放在“ if”语句之后。由于“ if and else语句”之间的分号,编译器给出了编译错误。如果我们忽略“其他”部分,则上述程序可以正常工作。

为了克服这个限制,我们可以将宏包含在“ do-while(0)”语句中。我们修改后的宏将如下所示。

#include 
  
#define MACRO(num, str) do {\
            printf("%d", num);\
            printf(" is");\
            printf(" %s number", str);\
            printf("\n");\
           } 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 
  
#define MACRO(num, str) ({\
            printf("%d", num);\
            printf(" is");\
            printf(" %s number", str);\
            printf("\n");\
           })
  
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]$ 
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。