Почему эти определения макросов расширены так по-разному? - PullRequest
1 голос
/ 10 июля 2020
#define INC1(a) ((a)+1)

#define INC2 (a) ((a)+1)

#define INC3( a ) (( a ) + 1)

#define INC4 ( a ) (( a ) + 1)

для вышеуказанного объявления на языке C INC1 и INC3 работают нормально, но INC2 и INC4 выдают ошибку, почему?

ссылка: https://www.geeksforgeeks.org/c-quiz-110-gq/ Первый вопрос

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Синтаксис функционально-подобных макросов требует, чтобы открывающие круглые скобки следовали сразу после имени макроса, без пробелов между ними.

Препроцессор использует пробел после имени макроса для вывода когда имя макроса заканчивается и начинается тело макроса.

Например:

#define INC2 (a) ((a)+1)

Это определяет не макрос, подобный функции, который расширяется до (a) ((a)+1).

1 голос
/ 10 июля 2020

Пожалуйста, примите это как пример расширения ответа какого-то чувака-программиста.

С вашими определениями этот фрагмент кода ...

INC1(10)
INC2(20)
INC3(30)
INC4(40)

будет расширен до .. .

((10)+1)
(a) ((a)+1)(20)
(( 30 ) + 1)
( a ) (( a ) + 1)(40)

Думаю, теперь возникает вопрос: «Почему наличие пробелов так важно?» Ответ на этот вопрос содержательно подразумевается в комментарии Groo (я надеюсь, что они позволят мне использовать и уточнить здесь).

Предположим, вы действительно хотите, чтобы макрос был расширен до что-то вроде ( a ) (( a ) + 1). Как бы вы это сделали, если бы эти два определения обрабатывались одинаково?

#define INC1(a) ((a)+1)
#define INC2 (a) ((a)+1)

И были бы расширены до

((10)+1)
((20)+1)

Разница между

INC(x) ...
INC (x) ...

дает это возможно интуитивно. Как только вы узнаете о проблеме.

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