Рубрики

Многострочные макросы в Си

В этой статье мы обсудим, как написать многострочный макрос. Мы можем написать многострочный макрос такой же как функция, но каждый оператор заканчивается символом «/». Давайте посмотрим на примере. Ниже приведен простой макрос, который принимает входной номер от пользователя и печатает, является ли введенный номер четным или нечетным.

#include <stdio.h>

  
#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 и else» компилятор выдает ошибку компиляции. Выше программа будет работать нормально, если мы игнорируем «остальное» часть.

Чтобы преодолеть это ограничение, мы можем заключить наш макрос в оператор «do-while (0)». Наш модифицированный макрос будет выглядеть следующим образом.

#include <stdio.h>

  
#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 <stdio.h>

  
#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]$ 

Эта статья составлена Нарендрой Кангралкар . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Многострочные макросы в Си

0.00 (0%) 0 votes