Какой раздел стандарта C89 допускает неявное правило int?

При использовании gcc код:

register a = 3;
static b = 3;

это разрешено при использовании флагов -std=c89 -pedantic-errors, хотя есть предупреждение.

Однако он получает ошибку с флагами -std=c99 -pedantic-errors.

Интересно, какой раздел стандартов C89 разрешает правило «неявного int»?


person Victor    schedule 21.10.2014    source источник


Ответы (1)


Разделом, в котором разрешено правило implicit int в C89, будет раздел 3.5.2 Спецификаторы типов, в котором говорится (выделено мной):

int , signed , signed int , или без спецификаторов типа

Кит Томпсон в комментариях указывает, что в C90 раздел имеет номер 6.5.2, и говорит: Единственное отличие состоит в некоторых вводных материалах, требуемых ISO, что приводит к изменению нумерации разделов.

В C99, где это изменилось, раздел это 6.7.2 Спецификаторы типов, и он говорит:

целое, подписанное или подписанное целое

Это также описано в документе N661: запретить неявные "int" в объявлениях, который говорит:

Изменение в спецификаторах типа 6.5.2; добавить новое предложение в начале первого абзаца ограничений: по крайней мере один спецификатор типа должен быть указан в спецификаторах объявления в объявлении.

    Change in 6.5.2 Type specifiers, Constraints, from:
            -- int, signed, signed int, or no type
               specifiers
    to:
            -- int, signed, or signed int
person Shafik Yaghmour    schedule 21.10.2014
comment
Раздел 3.5.2 стандарта ANSI C 1989 года является разделом 6.5.2 стандарта ISO C 1990 года. (Два стандарта описывают один и тот же язык. Единственная разница заключается в некоторых вводных материалах, требуемых ISO, что приводит к изменению нумерации разделов.) - person Keith Thompson; 21.10.2014
comment
@KeithThompson, спасибо, мне было интересно узнать об этом из предложения. - person Shafik Yaghmour; 21.10.2014