Приоритет оператора препроцессора «определен»? - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю над препроцессором c и обнаружил, что, поскольку «определен» является оператором только для препроцессора, его уровень приоритета никогда не указывается среди других операторов c. Поскольку это унарно и логично, я бы поставил его на 2-й уровень, но ...

Кто-нибудь знает точный ответ?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

За директивой #if немедленно следует константное экспериментальное .Любые defined операторы оцениваются сначала до того, как оценивается остальная часть выражения константы.

Раздел 6.10.1p4 стандартных состояний C:

PriorДля оценки, вызовы макросов в списке токенов предварительной обработки, которые станут выражением управляющей константы, заменяются (за исключением тех имен макросов, измененных определенным унарным оператором), как в обычном тексте.Если определенный токен генерируется в результате этого процесса замены или использование определенного унарного оператора не соответствует одной из двух указанных форм до замены макроса, поведение не определено. После того, как все замены в связи с расширением макроса и определенным унарным оператором были выполнены, все оставшиеся идентификаторы
(включая лексически идентичные ключевым словам) заменяются на номер pp 0, а затем каждый токен предварительной обработки преобразуется в токен. Полученные токены составляют выражение управляющей константы, которое оценивается в соответствии с правилами 6.6. ...

В разделе 6.6 ссылок приводится семантика выражений констант

0 голосов
/ 17 ноября 2018

C 2018 6.10.1 1 говорит:

Выражение, управляющее условным включением, должно быть выражением целочисленной константы, за исключением того, что… оно может содержать выражения унарного оператора в форме «defined идентификатор »или« defined ( идентификатор ) »… [Примечание: текст в кавычках здесь является смещенным отображаемым текстом в оригинале.]

Фраза «выражение унарного оператора» относится к 6.5.3 («Унарные операторы»), подразделу 6.5 («Выражения»).Таким образом, defined ведет себя как любой из других унарных операторов.

Однако обратите внимание, что операнд должен быть идентификатором.Это не может быть общим унарным выражением или cast-выражением , которое принимает большинство нормальных операторов.Именно эти унарные выражения или cast-expression символы вносят операторы с более высоким приоритетом в грамматику для унарных выражений.Это означает, что что-то вроде #if defined x++ не разрешено (даже до рассмотрения вопроса о том, может ли ++ появляться в целочисленном константном выражении), поэтому никакой другой опции никогда не будет.«defined идентификатор » никогда не появляется с каким-либо оператором с более высоким приоритетом рядом с идентификатором.

...