Возможно ли, что декларатор имеет нулевой спецификатор объявления?

Что касается заявления;

Каждое объявление объекта в C и C++ состоит из двух основных частей: последовательности из нуля или более спецификаторов объявления и последовательности из одного или нескольких деклараторов, разделенных запятыми. Например:
введите здесь описание изображения

Означает ли нулевой спецификатор объявление переменной с именем a как

a;

и нет

int a;

? Я пробовал это на примере

#include <stdio.h>

int main(){
     x = 9; 
     printf("%d\n", x);

return 0; 
}  

и это дает ошибку:

[Error] 'x' undeclared (first use in this function) 

person haccks    schedule 19.07.2013    source источник
comment
Откуда вы взяли это заявление? Это явно неправильно.   -  person Carl Norum    schedule 19.07.2013
comment
Возможно, это было верно для C до стандартизации, в котором было неявное правило int. В любом случае, это никогда не должно было использоваться.   -  person R.. GitHub STOP HELPING ICE    schedule 19.07.2013
comment
@КарлНорум; Я получил это от здесь   -  person haccks    schedule 19.07.2013
comment
Звучит как пред C89 C, действительный тогда, но с C89 и вперед не пускают. Хорошо, что вы были готовы со ссылкой.   -  person chux - Reinstate Monica    schedule 19.07.2013


Ответы (2)


Это было возможно в c89 с неявным правилом int, но вам требовался по крайней мере квалификатор или спецификатор класса хранения.

auto x = 3;   /* allowed in c89, not valid in c99 */

static y = 4; /* allowed in c89, not valid in c99 */

const z = 5;  /* allowed in c89 , not valid in c99*/

a;      /* not valid in c89, c99 without a prior declaration */

b = 6;  /* not valid in c89, c99 without a prior declaration */
person ouah    schedule 19.07.2013
comment
Но во всех этих объявлениях использовался спецификатор! - person haccks; 19.07.2013
comment
@hackks const — это квалификатор, а не спецификатор. - person ouah; 19.07.2013
comment
Я читал о квалификаторах, которые изменяют характеристики типа данных, такие как size или sign. Как насчет signed, это квалификатор или спецификатор? - person haccks; 19.07.2013
comment
квалификаторы не изменяют размер или знак, вы говорите о спецификаторе типа. signed — это спецификатор типа. - person ouah; 19.07.2013
comment
Я думаю, что на этот раз вы ошибаетесь. Прочтите этот ответ. - person haccks; 19.07.2013
comment
@hackks Нет, я не думаю, что ошибаюсь. Квалификаторы типа: const, volatile, restrict и _Atomic. См. c11, 6.7.3 Спецификаторы типа. - person ouah; 19.07.2013

Откуда бы вы ни взяли это утверждение, оно неверно. У вас должен быть хотя бы один спецификатор объявления, чтобы объявление было действительным. Вот соответствующий бит из стандарта (это изображение, потому что я не мог заставить вести себя уценку):

Стандарт C11 об объявлениях

person Carl Norum    schedule 19.07.2013