Согласно ISO C11, раздел 6.5.3.4 The sizeof and _Alignof operators
, подраздел 1 (ограничения):
Оператор sizeof
не должен применяться к выражению, имеющему тип функции или неполный тип, к имени такого типа в скобках или к выражению, которое обозначает элемент битового поля.
В разделе 6.3.2.1 Lvalues, arrays, and function designators
также есть подраздел 4, в котором говорится:
Обозначение функции - это выражение с типом функции. За исключением случаев, когда это операнд оператора sizeof
, оператора _Alignof
(65) или унарного оператора &
, указатель функции с функцией типа «return»
тип "преобразуется в выражение с типом" указатель на функцию, возвращающую
типа "".
Примечание к футу 65, на которое есть ссылка, уточняет:
Поскольку это преобразование не происходит, операнд оператора sizeof
или _Alignof
остается обозначением функции и нарушает ограничения в 6.5.3.4.
Согласно сечению 4 Conformance
:
В настоящем международном стандарте «должен» должен интерпретироваться как требование к реализации или программе; и наоборот, «не должен» должен интерпретироваться как запрет .
Следовательно, строго соответствующая программа никогда не должна принимать размер функции. Но, опять же, вероятно, он также должен использовать правильную форму main()
: -)
Однако здесь есть лазейка. Соответствующей реализации разрешено предоставлять расширения "при условии, что они не изменяют поведение каких-либо строго
соответствующая программа "(раздел 4 Conformance
, подраздел 6
).
Можно утверждать, что это является поведенческим изменением (допускающим sizeof(function)
, а не запрещающим его), но, поскольку исходная программа не была бы строго соответствующей в первую очередь, подраздел не запрети это.