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

Почему typedef нельзя использовать со статическими?

Почему typedef нельзя использовать со статическими? Например, приведенный ниже код является ошибкой

typedef static int INT2;

Какие другие правила следует использовать для использования typedef? Какие еще ключевые слова нельзя использовать с typedef?

Большое спасибо!

4b9b3361

Ответ 1

typedef не объявляет экземпляр переменной, он объявляет тип (тип псевдонима фактически),

static - это квалификатор, который вы применяете к экземпляру, а не к типу, поэтому вы можете использовать static при использовании этого типа, но не при определении типа. Как это..

typedef int int32;
static int32 foo;

Ответ 2

Ключевое слово static не относится к типу, в зависимости от контекста - это спецификатор хранилища или области видимости и не имеет никакого влияния на тип. Поэтому он не может использоваться как часть определения типа, поэтому он недействителен здесь.

typedef - это определение типа, то есть вы говорите, что "это имя" теперь относится к "этому типу", имя, которое вы даете, должно быть идентификатором, определенным стандартом языка, тип должен быть спецификатором типа, т.е. уже именованный тип, либо базовый тип, либо typedef'd, спецификатор struct, union, class или enum, с возможными классификаторами типов, то есть const или volatile.

Статическое ключевое слово, однако, не изменяет тип, оно говорит что-то об объекте (в общем, не в смысле ООП). это переменная, помещенная в статическое хранилище, а не тип.

Похоже, вы пытаетесь использовать typedef в качестве макроса, т.е.

#define MYINT static int

Ответ 3

Длительность хранения связана с объектами. Объявление typedef создает псевдоним - новое имя для типа. Он не создает объекты. Следовательно, вы не можете использовать спецификатор хранилища с typedef.

Ответ 4

Я думаю, что ответы от wich и Bailey правильные и достаточные, но чтобы помочь прояснить тем, кто прокомментировал: Когда вы объявляете typedef, результирующий тип должен быть согласован везде, где он может быть использован. Что делать, если созданный вами typedef появляется в следующем коде:

INT2 myfunction()
{
  return 0;
}

class MyClass
{
  public: INT2 x;
};

INT2 MyClass::x;
  • Функция, возвращающая INT2, не имеет смысла. Конечно, возвращаемое значение не является статическим (это не может быть).
  • Объявление x члена в MyClass будет статическим, а также его более поздним определением? Это не только избыточно, но неверно, потому что вы не используете статическое ключевое слово при определении статического члена - только при его объявлении.

То же самое относится к другим ключевым словам, упомянутым Бейли. Подумайте об этом: единственными ключевыми словами, которые могут объявлять последовательно тип для всех его применений, являются сами примитивные типы и модификаторы типа (const, unsigned и т.д.).

Ответ 5

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

Тип - это интерпретация местоположения памяти. Это описание того, какие данные живут в этом местоположении и связаны с набором операций, которые могут быть выполнены на этих данных.

Таким образом, тип и класс хранения связаны только с тем, что они оба говорят что-то о части данных. Ключевое слово typedef предназначено для создания новых имен для типов.

Что касается случайной аналогии...

Тип похож на разговор о конкретной марке и модели автомобиля.

Класс хранения похож на то, что автомобиль хранится в частном отапливаемом гараже и используется только на частном ипподроме.

typedef - это псевдоним для конкретной модели и модели.

Ответ 6

typedef не может использоваться вместе с static, поскольку оба typedef и static являются классами хранения. Если вы определяете переменную как typedef static int a;, тогда существует несколько классов хранения для переменной a.

Классы хранения используются для определения области видимости и времени жизни переменных и/или функций. Некоторые примеры: static, auto, register, extern, typedef и т.д.