Что означает typedef без типа? - PullRequest
0 голосов
/ 28 ноября 2018

Из стандарта N1570 6.7.8:

Объявление typedef не вводит новый тип, только синоним для указанного типа.

Так что я ожидал, что невозможно написать что-то вроде этого:

typedef t;
t *t_ptr;

, и он не должен скомпилироваться, так как нет типа для введения синонима в предусмотренный.Но это нормально: Демо .Так, что это когда-либо значит и почему это компилируется?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

По умолчанию int.

Предупреждение компилятора показывает, что происходит:

#1 with x86-64 gcc 8.2
<source>:1:9: warning: type defaults to 'int' in declaration of 't' [-Wimplicit-int]
 typedef t;

Начиная с C99 и далее, неявное int Правило было удалено.Так что это не применимо с C99 и далее.

Если вы используете опцию компилятора -pedantic-errors в GCC (что означает строгое соответствие стандарту), выдает ошибку .См. здесь .

Если вам интересно, соответствующий раздел в C89 стандарт, который позволил это:

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

  • void
  • char
  • подписанный символ
  • неподписанный символ
  • short, подписанное short, короткое int или подписанное short int
  • unsigned short или unsigned short int
  • int, подписанное, подписанное int или без типаСпецификаторы

Таким образом, в C99 последняя часть того, что было выделено выше ( или без спецификаторов типа ), была удалена.

0 голосов
/ 28 ноября 2018

Объявление typedef определяет синоним для типа объекта или указателя.Поэтому вы должны указать как тип, для которого вы хотите создать синоним, так и имя, которое будет использоваться в качестве синонима.

Например:

// 'byte_t' is a synonym for 'unsigned char'
typedef unsigned char byte_t;
// 'handler_t' is a synonym for 'void (*)(int)', a function pointer
typedef void (*handler_t)(int);
// 'short_p' is a synonym for 'short *'
typedef short * short_p;
// 'record' is a synonym for an anonymous structure
typedef struct {
    int a;
    char *b;
    } record;
// 'error_p' is a synonym for a pointer to 'struct error', defined somewhere else
typedef struct error *error_p;

Еще много примеров в цитируемом источнике.

0 голосов
/ 28 ноября 2018

Это зависит от того факта, что отсутствующая спецификация типа по умолчанию равна int.

Итак, ваше утверждение

 typedef t;

совпадает с

 typedef int t;

При соответствующем уровне предупреждения компилятор выдает предупреждение:

warning: type defaults to ‘int’ in declaration of ‘t’ [-Wimplicit-int]
 typedef t;
         ^

При этом не не полагается на это поведение, правило "implicit int" устарело с C99.

...