2010-02-07 4 views
18

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

typedef static int INT2; 

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

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

+8

Оба ЬурейиЕ и статические классы для хранения на языке (строго актуален для C, и я считаю, что это верно и для C++). У вас может быть только один класс хранения в одном объявлении - в вашем примере есть два, следовательно, ошибка. –

+3

+1. «Спецификатор typedef называется« спецификатором класса хранения »для удобства синтаксиса; – dirkgently

ответ

31

ЬурейиЕ не объявляет экземпляра переменных, она объявляет тип (псевдоним типа на самом деле),

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

typedef int int32; 
static int32 foo; 
+3

'static' не является классификатором, а спецификатором класса * *. Следовательно, он не является «частью типа», например, такими как «const», например. 'typedef const int ci; ci x = 42; '(типы с разными квалификаторами по-прежнему одинаковы, но могут быть несовместимы). – dyp

+0

@John Knoeller Элегантный! Отличный ответ! – Sohaib

20

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

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

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

Похоже, вы пытаетесь использовать ЬурейеЕ как макрос, т.е.

#define MYINT static int 
+1

Почему это так важно? –

+0

@ The Douglas Adams fan: Я думаю, что так оно и есть; возможно, не так четко, как ответ Бейли. Спецификаторы и спецификаторы области хранения не являются частями * типа * чего-либо; они являются частями того, как экземпляры типа хранятся или находятся в зоне действия. –

+0

@ Robert хорошо, как говорит ключевое слово, это тип defition, поскольку static не является частью типа, если его нельзя использовать в определении типа. – wich

7

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

3

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

INT2 myfunction() 
{ 
    return 0; 
} 

class MyClass 
{ 
    public: INT2 x; 
}; 

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

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

3

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

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

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

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

типа, как говорить о конкретной марке и модели автомобиля.

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

typedef - это прозвище для конкретного марка и модели.

2

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

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

+0

Это интересно! В самом деле, 'typedef' указывается как спецификатор * storage-class *, хотя« только для синтаксического удобства »6.7.1/3. – dyp

+0

Джонатан Леффлер сказал о том же в [комментарии к OP] (http://stackoverflow.com/questions/2218435/why-typedef-can-not-be-used-with-static#comment2172109_2218435). – dyp

Смежные вопросы