Каково действие #define в этом экземпляре? - PullRequest
0 голосов
/ 04 октября 2019

Как часть моей домашней работы, мне дали этот код, чтобы помочь с задачей, которую они нам дали ... создать базовую оболочку, которая поддерживает трубопровод, фоновые процессы, ряд встроенных команд и т. Д. Я прочитал код, который они нам дали для разбора ...

Я знаком с ключевым словом #define в C, однако я не видел, чтобы оно использовалось, как в приведенном ниже коде. : а именно, для чего c? Я предполагаю, что это было назначено для обозначения персонажа, но я не уверен:

#define PIPE  ('|')
#define BG    ('&')
#define RIN   ('<')
#define RUT   ('>')

#define ispipe(c) ((c) == PIPE)
#define isbg(c)   ((c) == BG)
#define isrin(c)  ((c) == RIN)
#define isrut(c)  ((c) == RUT)
#define isspec(c) (ispipe(c) || isbg(c) || isrin(c) || isrut(c))

Любая помощь или совет очень ценится.

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Последние пять #define операторов, которые вы даете, определяют макросов , каждый из которых принимает аргумент , который здесь всегда называется c. Ваши первые четыре оператора #define, технически, также являются макросами, но они не нуждаются в аргументе - они просто заменяют их «значения», когда они встречаются;часто программисты ссылаются на макросы без аргументов как tokens , при этом токен PIPE здесь имеет значение токена ('|').

Позже в файле (возможно) будетмогут быть случаи, когда вызывается один или несколько из этих макросов, и этот вызов будет иметь значение для фактического аргумента, например, вот так:

if (ispipe(test_arg)) ++npipes;

Этот макрос "вызов"будет заменен (препроцессором) следующим расширением:

if (((test) == ('|')) ++npipes;

И, аналогично, для других макросов #define XXX (c).

Примечание:Весьма распространено добавлять (много) скобок в определениях макросов, просто чтобы быть уверенным, что код делает то, что вы «думаете», после того, как препроцессор сделал свое дело.

Feelсвободно запрашивать дальнейшие объяснения и / или разъяснения.

3 голосов
/ 04 октября 2019

#define не является функцией, это директива препроцессора .

c может быть чем угодно. Если вы напишите ispipe(42), то препроцессор изменит его на ((42) == PIPE). Если вы напишите ispipe(while(1);), то препроцессор изменит его на ((while(1);) == PIPE), что приведет к оцепенению компилятора при его чтении.

Препроцессор слеп и не знает много о синтаксисе C, и ничегоего семантики;единственный способ понять, что такое c, - это либо перепроектировать предполагаемое использование, либо попросить того, кто написал код без комментариев, сказать, что они имели в виду.

После редактированияВполне разумно ожидать, что c должен быть char, для того чтобы его можно было сравнить с '|' и аналогичными. Но даже передача 0xDEADBEEF должна правильно скомпилироваться (возвращая FALSE).

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