Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Различие в определении структуры


Автор: ManiaK 25.7.2006, 12:27
Сразу, пока не забыл: речь идёт о языке Си!

В чём принципиальное различие:

Код

struct St
{
// bla-bla-bla
};

и
Код

typedef struct
{
// bla-bla-bla
} St;


Недавно обнаружил этот подводный камень, был удивлён smile
Скажет кто-нибудь ответ?.. 

Автор: bel_nikita 25.7.2006, 12:32
если знаешь ответ на вопрос, тогда зачем задавать вопрос? 

Автор: ManiaK 25.7.2006, 12:45
Цитата(bel_nikita @  25.7.2006,  12:32 Найти цитируемый пост)
если знаешь ответ на вопрос, тогда зачем задавать вопрос? 

Мне интересно, я один такой не знал или нет smile 

Автор: Любитель 25.7.2006, 12:49
Принципиальной - никакой. Вообще отличие только во внешнем виде и на этапе компиляции - генерируется промежуточный тип анонимной структуры. 

Автор: Romikgy 25.7.2006, 12:51
Имхо во втором случае везде при объявлении переменных даной структуры не надо тянуть слово 
Цитата(ManiaK @  25.7.2006,  11:27 Найти цитируемый пост)
struct

в чистом Си 

Автор: ManiaK 25.7.2006, 13:01
Цитата(Любитель @  25.7.2006,  12:49 Найти цитируемый пост)
Принципиальной - никакой.

Ура! Теперь я позларадничаю smile

Я не зря сказал, что речь идёт о Си! Потому как в Си++ действительно никакой разницы нет.

Но в Си не существует единой таблицы имён типов. Их как минимум две: таблица struct-типов и таблица {базовые типы + типы, образованные typedef'ами}. Когда мы пишем вот так:

Код

struct
{
} A;


То компилятор добавляет сгенерированное им самим имя struct-типа, но для нас, программистов, этот тип недоступен smile Это знают все опытные Сишники. Так?

Тогда кто вам сказал, что вот эта ситуация чем-то отличается от описанной строчкой выше:

Код

typedef struct
{
} A;


 smile 

При таком определении имя определённой структуры знает только компилятор, а вам же, программистам, доступен только синоним!!

Это кстати касается и Си++ по идее. Тогда в чём различие?..

Элементарно, Ватсон! smile В Си перед любым упоминанием имени структуры мы обязаны написать написать ключевое слово struct. В Си++ этого не требуется и все довольны smile

Кстати, наши "деды", делали вот такие финты с Си:

Код

struct MyStruct
{
// bla-bla
};

typedef struct MyStruct* MyStruct;

MyStruct oooops;// Нет, это не то, что вы подумали, это - указатель :)))


Я в шоке smile

Добавлено @ 13:02 
Romikgy, опередил smile  

Автор: Любитель 25.7.2006, 13:05
Цитата(ManiaK @  25.7.2006,  13:01 Найти цитируемый пост)
То компилятор добавляет сгенерированное им самим имя struct-типа, но для нас, программистов, этот тип недоступен  Это знают все опытные Сишники. Так?

Так. Это я и имел в виду, говоря о промежуточном типе.

Цитата(ManiaK @  25.7.2006,  13:01 Найти цитируемый пост)
В Си перед любым упоминанием имени структуры мы обязаны написать написать ключевое слово struct.

Да, а здесь свосем ступил.  smile Забываемс, забываемся...
 

Автор: bel_nikita 25.7.2006, 13:28
ManiaK, 
Может оформи красиво и вставь в факю smile  

Автор: ManiaK 25.7.2006, 13:32
Цитата(bel_nikita @  25.7.2006,  13:28 Найти цитируемый пост)
Может оформи красиво и вставь в факю

Время будет - сделаю. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)