2014-09-13 5 views
3

Является ли следующий законный C89?В C89, какова область применения имени функции в определении функции «старого стиля»?

void f(a) 
char a[sizeof &f]; 
{ 
} 

Моего мышление да, так как объем идентификатора объявленного вне любого блока объема начинается сразу же после окончания описателя и простирается до конца единицы трансляции. Следовательно, область «f» включает в себя список объявлений.

«gcc -pedantic -Wall» принимает его. «clang -pedantic -Wall» отвергает его, как и lcc.

+0

Очень хороший вопрос. – fuz

ответ

2

С C90 стандарта (курсив мой)

(C90, 6.1.2.1) «Структура, объединение, и перечисление метки имеют объем, который начинается сразу же после появления метки в спецификатор типа, объявляющего тег. Каждая константа перечисления имеет объем, который начинается сразу после появления его определяющего перечислителем в списке перечислителя. Любой другой идентификатор имеет объем, который начинается сразу после завершения его описателя. "

Так я также, это действительный объявления функции.

EDIT: Дьявола в деталях (слово завершения) и после того, как второй думал, что я думаю, что это не является допустимой декларация функции, как описатель не является полным после void f(a).

void f(a) 
char a[sizeof &f]; 
       ^

^ здесь отмечает, где описатель является полным и где начинается f сфера.

+0

Я понимаю, что вы имеете в виду, но синтаксис для деклараторов довольно ясен. Если декларатор все еще может быть «неполным» в некотором смысле до тех пор, пока не будет представлен какой-либо список объявлений, я бы ожидал, что стандарт скажет это. Странно, что gcc и clang не согласны (даже после добавления -std = c89). –

+0

@SebGrindle в C99 (функции с формой списка-идентификатора все еще действительны в c99), полный декларатор определяется как (6.7.5p2) a * "Полный декларатор является декларатором, который не является частью другого декларатора" * Здесь I думаю, мы признаем, что 'void f (a) char a [sizeof &f];' - это полный декларатор. В [DR # 246] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_246.htm) Комитет C, похоже, не ошибается, когда Клайв использует формулировку * end полного декларатора * для заполнения декларатора. – ouah

+0

Спасибо за ссылку на DR # 246 (указывая, что кто-то еще подумал, что фраза «декларатор завершена» запутанна). Комитет ответил: «[..] текущая формулировка достаточно ясна». Хммм. –