C 2018 6.10.1 1 говорит:
Выражение, управляющее условным включением, должно быть выражением целочисленной константы, за исключением того, что… оно может содержать выражения унарного оператора в форме «defined
идентификатор »или« defined (
идентификатор )
»… [Примечание: текст в кавычках здесь является смещенным отображаемым текстом в оригинале.]
Фраза «выражение унарного оператора» относится к 6.5.3 («Унарные операторы»), подразделу 6.5 («Выражения»).Таким образом, defined
ведет себя как любой из других унарных операторов.
Однако обратите внимание, что операнд должен быть идентификатором.Это не может быть общим унарным выражением или cast-выражением , которое принимает большинство нормальных операторов.Именно эти унарные выражения или cast-expression символы вносят операторы с более высоким приоритетом в грамматику для унарных выражений.Это означает, что что-то вроде #if defined x++
не разрешено (даже до рассмотрения вопроса о том, может ли ++
появляться в целочисленном константном выражении), поэтому никакой другой опции никогда не будет.«defined
идентификатор » никогда не появляется с каким-либо оператором с более высоким приоритетом рядом с идентификатором.