LINUX.ORG.RU
Ответ на: комментарий от Deleted

Да им тоже будет интересно, по этому и кастанул. А вообще, кто нибудь, кастаните сишников, я их тут не знаю.

Deleted
()
Ответ на: комментарий от Deleted

ааа, что ты делаешь! перестань

anonymous
()

Я всегда думал, что typedef просто копирует тип в глобальное простарнство имен и все. Если нет, то что но делает?

Не в глобальное, а локальное внутри {} и функций.

staseg ★★★★★
()
Ответ на: комментарий от staseg

В storage type его скорее всего засунули просто для упрощения, т.к. использовать их можно в одних и тех же участках программы. В С++ это уже не так.

staseg ★★★★★
()
Ответ на: комментарий от staseg

self fix

Не в глобальное, а локальное внутри {} и функций.

Ну и в глобальном пространстве тоже, конечно.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от staseg

Не в глобальное, а локальное внутри {} и функций.

В смысле? Тогда может в «текущее» пространство имен?

typedef struct {
	char *text;
	int type;
} Token;

Token tok;

int main() {
	...
}

Deleted
()
Ответ на: комментарий от staseg

В storage type его скорее всего засунули просто для упрощения, т.к. использовать их можно в одних и тех же участках программы. В С++ это уже не так.

Ок, спасибо.

Deleted
()
Ответ на: комментарий от Deleted

В смысле? Тогда может в «текущее» пространство имен?

Наверное именно это я и хотел сказать :)

staseg ★★★★★
()

В грамматике сишки она стоит наряду с EXTERN...

Чисто исторически. Первоначально никакого typedef не было, а когда осознали, что одними '#define...' и именованием структур не обойтись, то просто «удачно» вписали в существующую грамматику, чтобы не усложнять. К семантике это никакого отношения не имеет.

ABW ★★★★★
()

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

Lincor
()
Ответ на: комментарий от Deleted

парсишь вместе с другими storage class modifiers. синтаксис целиком совпадает. никогда не думал, почему алиас для массива int выглядит так?

typedef int array[10]
по этой же причине имя старого типа стоит первым: чтобы сделать синтаксис typedef аналогичным объявлению переменной.

Lincor
()
Ответ на: комментарий от Lincor

кстати, typedef ничего не копирует и нового типа не создает

Ты о пространствах имен имеешь представление? Если типа нет в пространстве имен, ты его заюзать не сможешь.

парсишь вместе с другими storage class modifiers

Это понятно, да.

никогда не думал, почему алиас для массива int выглядит так?

Что такое алиас?

имя старого типа стоит первым

...Т.к. typedef'у нужно знать, какой тип мы копируем и именуем?

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Deleted

Если типа нет в пространстве имен, ты его заюзать не сможешь.

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

Что такое алиас?

синоним. typedef создает type alias.

...Т.к. typedef'у нужно знать, какой тип мы копируем и именуем?

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

Lincor
()
Ответ на: комментарий от Lincor

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

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

ну, и глобальном, куда ж без него.

Текущее может быть глобальным. Мы же выше со staseg'ом определились.

Deleted
()
Ответ на: комментарий от Lincor

это понятно, но глобальное используется в любом случае.

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

Т.е. Объявили мы переменную во втором неймспейсе, заюзали в третьем. Компилятор ищет ее «с конца». Сначала в третьем неймспейсе, потом во втором. Если нашел, как в нашем случае - останавливается, если нет - смотрит в «более старых» неймспейсах.

Deleted
()

Задача грамматики - распознать описываемый язык или определить, что ввод таковым не является.

Если для С написать грамматику, которая описывает _ровно_ тот же класс программ, который может стайпчекать компилятор, то грамматика получится слишком сложной.

Проще написать маленькую «неточную» грамматику (и построить по ней парсер), которая охватывает строго больше валидных программ и написать отдельный тайпчекер (для результата парсера).

sf ★★★
()
Ответ на: комментарий от Deleted

ибо как уже ниже отметили:

typedef это апостериорный(aдхок) хак,

ибо всеми любимое int* z,y; /* а круче ещё веселее когда нужно обьявить два однотипных указателя на функцию... */

известно что.

ps. ТС'у скоро-скоро сам в первом издании увидешь, ну и полистай же http://www.tuhs.org/ - там видно когда появилось typedef

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.