Подтвердить что ты не робот

Долго длинный тип в C?

Я знаю, что название кажется довольно глупым, но я думаю, что это стоит спросить.

Возьмите это объявление (или определение, возможно), например:

_Thread_local long volatile static int _Atomic const long unsigned x = 10;

Я рассматривал long long как тип, но если это имя типа, как можно вставить в него столько спецификаторов?

Поэтому я консультировался с N1570 с этим вопросом, только чтобы быть более смущенным. В нем упоминаются некоторые термины, такие как "спецификатор типа" и "тип-классификатор", и я не могу найти long long в "спецификаторах типов", но не long long примитивный тип в C? Есть так много книг, которые мне так говорят!


Уточнение не дублируется:

Да, я видел существующий вопрос с long int long, но этот вопрос имеет какое-то отношение к квалификаторам и находится на C.

4b9b3361

Ответ 1

Если вы внимательно прочитали правильные биты стандарта, вы обнаружите, что объявление монстра в вопросе действительно, даже если это неправдоподобно.

"Правильные биты" включают в себя:

6.2.5 Типы

Существует пять стандартных стандартных целочисленных типов, обозначенных как signed char, short int, int, long int и long long int. (Эти и другие типы могут быть обозначенный несколькими дополнительными способами, как описано в 6.7.2.)

...

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

6.7.2 Спецификаторы типов

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

...

  • long long, signed long long, long long int или signed long long int
  • unsigned long long или unsigned long long int

Другие спецификаторы декларации включают классы хранения (static и _Thread_local в примере) и типы классификаторов (volatile и _Atomic).

6.7 Объявления

6.7 Объявления

Синтаксис

Объявление:
      объявления-спецификаторы init-declarator-listopt;
      static_assert-declaration

декларирование спецификаторы:
      хранения класса спецификатор
      декларация спецификаторы <суб > неавтоматическогосуб >
      спецификаторы спецификации спецификатора типа opt
      спецификаторы объявления-спецификатора типа opt
      спецификатор спецификации спецификатора спецификации opt
      спецификаторы-указатели выравнивания-спецификаций opt

Кроме того, как отмечено Olaf в comment:

6.11.5 Спецификаторы класса хранения

Размещение спецификатора класса хранения, отличного от начала декларации спецификаторы в декларации являются устаревшей функцией.

Также эксцентрично разделить ключевые слова целочисленного типа (спецификатор типа). Более ортодоксальной версией декларации будет:

static _Thread_local _Atomic const volatile unsigned long long int x = 10;

(или он может потерять int).