почему может работать определение макроса "#define yyparse ol_parser_parse"? - PullRequest
0 голосов
/ 21 апреля 2019

Раньше я не читал сгенерированный код из yacc внимательно.Теперь я увидел один фрагмент кода, подобный этому:

#define yyparse ol_parser_parse

Я знаю определение yyparse следующим образом:

int yyparse (void) 

, поэтому это определение макроса должно бытьинтерпретируется как: каждый «ol_parser_parse» в коде будет заменен на «yyparse».И я написал некоторый код для тестирования:

#include <stdio.h>
#define yyparse ol_parser_parse
void yyparse()
{
    printf("hello world\n");
}
void main()
{
   ol_parser_parse();
}

Это сработало!Но согласно определению о «макроопределении» :

#define <identifier>(<parameter list>) <replacement token list>

я смущен этим.Кто может помочь мне объяснить это?Заранее спасибо!

1 Ответ

2 голосов
/ 21 апреля 2019

Вот ваш код, видимый компилятором после выполнения подстановки:

#include <stdio.h>

void ol_parser_parse()
{
    printf("hello world\n");
}
void main()
{
   ol_parser_parse();
}

В этом нет ничего таинственного.Каждый экземпляр «yyparse» становится «ol_parser_parse» в каждой строке, следующей за #define.

. В документации идентификатор означает заменяемую вещь и список замененных токенов это то, что вы заменяете.Вы также можете иметь параметры, такие как:

#define TIMES_TWO(n) ((n) * 2)

Где вы можете сделать:

int x = TIMES_TWO(3);

Где это эквивалентно:

int x = ((3) * 2);

Где дополнительные скобкитак что вы можете сделать это и не испортить порядок операций:

int x = TIMES_TWO(1 - 5);

Без скобок это будет выглядеть так:

int x = 1 - 5 * 2;

Что оценивается как 1 - 10, чтоэто не то, что вам нужно.

Есть способ эффективно использовать #define, чтобы скрыть иные уродливые детали реализации.Имя ol_parser_parse не должно вызывать беспокойства, если вы можете использовать макрос yyparser.Это дает разработчикам свободу переименовывать эту функцию и соответствующий макрос, не нарушая весь ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...