Понимание замены текста в макросе x - PullRequest
1 голос
/ 22 апреля 2020

Приведенный ниже код объясняет, как простые макросы x работают простым способом в c языке программирования

#include <stdio.h> 

// Defines four variables. 
#define VARIABLES \ 
    X(value1, 1)  \ 
    X(value2, 2)  \ 
    X(value3, 3)  \ 
    X(value4, 4) 

// driver program. 
int main(void) 
{ 
    // Declaration of every variable 
    // is done through macro. 
    #define X(value, a) char value[10]; 
        VARIABLES 
    #undef X 

    // String values are accepted 
    // for all variables. 
    #define X(value, a) scanf("\n%s", value); 
        VARIABLES 
    #undef X 

    // Values are printed. 
    #define X(value, a) printf("%d) %s\n", a, value); 
        VARIABLES 
    #undef X 
    return 0; 
} 

Формируйте определение макросов в c. это просто инструмент для замены текста. поэтому компилятор будет воссоздавать код следующим образом:

#include <stdio.h> 

int main(void) 
{ 
    char value1[10]; 
    char value2[10]; 
    char value3[10]; 
    char value4[10]; 

    scanf("\n%s", value1); 
    scanf("\n%s", value2); 
    scanf("\n%s", value3); 
    scanf("\n%s", value4); 

    printf("%d) %s\n", 1, value1); 
    printf("%d) %s\n", 2, value2); 
    printf("%d) %s\n", 3, value3); 
    printf("%d) %s\n", 4, value4); 
    return 0; 
} 

Препроцессор заменит

VARIABLES ------> X(value1, 1) X(value2, 2) X(value3, 3) X(value4, 4)

И заменит X (value1, 1) на значение char [10 ]; следующим образом

X(value1, 1)      char value[10];
  -----                -----
    v                    ^
    |                    |
    +--------------------+

//how the code become like this ?

 char value1[10];

//why not like this?

char value[10]1;

//or like this?

char value[10];1

//why the macro consider value as the text and place 1 immediately after it?

А как насчет второго аргумента 1, будет ли он заменен чем-то?

X(value1, 1) 
         ---             
          ^                    
          |                    
//where is this parameter replaced with    

1 Ответ

0 голосов
/ 22 апреля 2020

В #define X(value, a), value и a - это макропараметры. Если вы передадите X(value1, 1), то они станут значениями этих макропараметров, как при передаче параметров в функцию.

В случае #define X(value, a) char value[10]; параметр a не используется в макросе, поэтому его просто игнорируют.

Это часто встречается при использовании макросов X, у вас может быть несколько значений, но только некоторые, которые имеют смысл использовать в конкретном случае c. Вам все равно придется передавать все параметры, но использовать их в каждом макросе необязательно.

Работает так же, как обычные старые функции. Эта функция совершенно корректна:

void foo (int a, int b)
{
  printf("%d", a);
}

Откуда взялись b go? Нигде эта функция просто не использовалась.

...