Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по typedef struct 
:(
    Опции темы
leniviy
Дата 16.3.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Привет. Есть не моя структура и существующий код, в котором объявляются указатели на неё с ключевым словом struct.
Можно ли задекларировать новый тип - синоним существующего, чтобы работал в .c и .cpp и переменные этого типа можно было объявлять с модификатором struct?

Код

typedef struct AAA
{
    int i;
} AAA;

AAA* p1; //OK
struct AAA* p2; //OK

//struct BBB; //.c: OK; .cpp: causes on next line: 'BBB' : redefinition; different basic types
typedef struct AAA BBB;

BBB* p3; //OK
struct BBB* p4; //.c: OK; .cpp: error C2371: 'BBB' : redefinition; different basic types


Похоже, что при объявлении нового типа он не помечается как "структура"
PM MAIL   Вверх
math64
Дата 16.3.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



В объявлении typedef struct AAA BBB; BBB объявляется как тип, а не структура. В C имена структур и типов находятся в разных пространствах имён, ключевое слово struct обязательно, в C++ struct можно опускать, но использование struct перед именем типа запрещено в обоих языках.
Можно написать
Код
#define BBB AAA
, но в этом случае ВВВ будет заменяться на AAA всегда
PM   Вверх
leniviy
Дата 16.3.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



да. Я уже в своё время намучился с макросом EOF. 
PM MAIL   Вверх
Dem_max
Дата 16.3.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Код

typedef struct THEAD
{
  char  Version;
  DWORD RecordsCount;
  WORD  HeaderSize;
  WORD  RecordSize;
} THEAD;

THEAD BBB;
typedef THEAD *PBBB;

//---------------------------------------------------------------------------
void func()
{
BBB.Version = 1;

PBBB->Version = 1;
}


Это сообщение отредактировал(а) Dem_max - 16.3.2009, 17:05


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 16.3.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Dem_max, какое отношение имеет приведенный код к сабжу ?


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 16.3.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



mes
чел хотел переопределение названия структуры


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 16.3.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Dem_max @  16.3.2009,  15:40 Найти цитируемый пост)
чел хотел переопределение названия структуры 

не совсем так, eму требуется следующее  :
Цитата(leniviy @  16.3.2009,  14:07 Найти цитируемый пост)
Есть не моя структура и существующий код, в котором объявляются указатели на неё с ключевым словом struct.
Можно ли задекларировать новый тип - синоним существующего, чтобы работал в .c и .cpp и переменные этого типа можно было объявлять с модификатором struct?

smile



--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 16.3.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



mes
тогда
struct THEAD stgr; или THEAD stgr;


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 16.3.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Dem_max @  16.3.2009,  18:23 Найти цитируемый пост)
тогда
struct THEAD stgr; или THEAD stgr; 


если структура заранее объявлена, как struct Т;  то не получится Т тайпдефить к другой структуре. 
т.е  не допустима такая последовательность :
Код

struct T;
typedef Some T;

именно обход этой проблемы и ищет тс, а причину описал math64:
Цитата(math64 @  16.3.2009,  14:17 Найти цитируемый пост)
В объявлении typedef struct AAA BBB; BBB объявляется как тип, а не структура. В C имена структур и типов находятся в разных пространствах имён, ключевое слово struct обязательно, в C++ struct можно опускать, но использование struct перед именем типа запрещено в обоих языках.


smile

Это сообщение отредактировал(а) mes - 16.3.2009, 20:53


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 16.3.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



mes
Я взял книжку 1990 года про СИ и привел пример, там от С++ и речи не вели.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
ParaPik
Дата 8.4.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Вообще, ключевое слово struct также используется для того, чтобы избежать неоднозначности. Т.е. существует два случая испоьзования struct:
1. Объявление структуры.
2. Решение неоднозначности.
Например:
Код

struct my_struct
{
     int i_num;
     double d_num;
};

void func()
{
    char my_struct[] = "String";
    struct my_struct obj = {5, 10.5};
}

PM MAIL   Вверх
zim22
Дата 8.4.2009, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(ParaPik @  8.4.2009,  20:54 Найти цитируемый пост)
2. Решение неоднозначности.

какая такая неоднозначность?
если слово struct убрать - оно вообще не скомпилится smile

Код

void func()
{
    char my_struct[] = "String";
    my_struct obj = {5, 10.5};
}



--------------------
PM MAIL   Вверх
J0ker
Дата 8.4.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



в C++ типы "T" и "struct T" эквивалентны - в отличии от plain C


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 8.4.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(zim22 @  8.4.2009,  20:03 Найти цитируемый пост)
какая такая неоднозначность?
если слово struct убрать - оно вообще не скомпилится smile

как раз о том и речь, без указания struct в приведенном примере возникает неоднозначность и как следствие невозможность компиляции. smile


--------------------
PM MAIL WWW   Вверх
ParaPik
Дата 9.4.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Дело в том, что C++, в отличии от других языков программирования, таких как C# и Java, позволяет объявлять переменную с тем же именем, что и название, в данном случае, структуры, но с другим типом(char, int, double и так далее). И чтобы указать компилятору, что вы имеете в виду  именно тип структуру, то надо перед именем структуры поставить ключевое слово struct(это же относится и к ключевому слову class). А то, с чего началась данная тема, вообще зависит от реализации компилятора. Так что, некоторые старые компиляторы, а вполне возможно и новые, нормально воспримут код, написанный в начале темы.  

Это сообщение отредактировал(а) ParaPik - 9.4.2009, 16:34
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1130 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.