Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906

Различные определения структуры (struct)

25.04.2013, 12:21. Показов 6468. Ответов 5

Студворк — интернет-сервис помощи студентам
Господа, вот возник у меня вопрос - зачем было понапридумано столько различных видов задания структур?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct
{int x;};
 
struct
{int x;} s2;
 
struct _s3
{int x;};
 
struct _s4
{int x;} s4;
 
typedef struct
{int x;} s5;
 
typedef struct _s6
{int x;} s6;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
/*s2, s4 - переменные
s5, s6 - типы
_s3, _s4, _s6 - типы*/
 
s4.x = 666;
 
s5 MYs5; MYs5.x = 666; //struct s5 MYs5; MYs5.x = 666; - двойное объявление типа s5
s6 MYs6; MYs6.x = 666;
 
_s3 MY_s3; MY_s3.x = 666; //struct _s3 MY_s3; MY_s3.x = 666; - двойное объявление переменной my__s3 (все хорошо)
_s4 MY_s4; MY_s4.x = 666;
_s6 MY_s6; MY_s6.x = 666;
 
return 0;
}
Чтобы объявить экземпляр структуры в самом коде в языке C++ (в чистом нельзя) можно опустить слово struct (в комментариях к s4 и _s2). Это ладно.

Но вот
- почему можно объявить первую структуру, а обратиться к ее элементам нельзя?
- что за тип __CAMB переменной x, принадлежащей неименованной структуре с s2? Не int, а вот такая борлондовая штука.
- почему к примеру s6 и _s6 оба являются типами?
- зачем в эту кучу пихать еще и typedef?

Было бы понятно как в случае с s4:
_s4 это тип, а s4 это переменная этого типа. Хотим сразу использовать переменную (чтобы не дальше в коде ее отдельно объявлять), пишем s4, не хотим - не пишем. Хотим создать несколько переменных типа _s4 - так вперед, вот он тип. Все красиво.

А когда, как в случае с s6, у нас и s6 тип, и _s6 тоже тип, и все это еще и помечено typedef-ом, то вообще это какая-то тавтология.
Зачем остальные виды объявлений? Помогите разобраться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2013, 12:21
Ответы с готовыми решениями:

Аналог IndexOf для структуры struct
Привет всем. Подскажите кто в курсе. Вопросик вот какой. Допустим у меня есть список TStringList *list = new TStringList(); ......

Объявление структуры в виде struct stat s
Столкнулся со следующей непоняткой. Пытаюсь в коде объявить структуру как stat s; Но таким образом структура почему то не объявляется...

Как использовать собственный класс в структуре struct до определения самого класса в тексте программы
Проблема такая: хочу в структуре одним из элементов сделать класс. Проблема в том, что эта структура задается в самом начале текста...

5
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
25.04.2013, 12:37
спасибо за вопрос.
по-моему все логично и правильно.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
- почему можно объявить первую структуру, а обратиться к ее элементам нельзя?
это не объявили, а просто описали(написали без применения). это ничему не противоречит.
начинаете объявлять вы только в случае 2.
как еще один пример: мы можем объявить int a; а потом в коде просто написать
C++
1
a; //по сути пустая писанина
Цитата Сообщение от SatanaXIII Посмотреть сообщение
у нас и s6 тип, и _s6 тоже тип, и все это еще и помечено typedef-ом
немного не так, тут s6 стал типом только благодаря typedef
без typedef имеем случай 4 (тип и переменная)
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
25.04.2013, 13:10  [ТС]
Цитата Сообщение от AntonChik Посмотреть сообщение
это ничему не противоречит.
как еще один пример: мы можем объявить int a; а потом в коде просто написать
C++
1
a; //по сути пустая писанина
Здравому смыслу. )
int a; мы могли бы при желании как-то где-то использовать. Пустая писанина да, но с возможностью использования. А тут вообще хрень.

Цитата Сообщение от AntonChik Посмотреть сообщение
немного не так, тут s6 стал типом только благодаря typedef
Да. И вопрос - нахрена?
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
25.04.2013, 13:26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
int a; мы могли бы при желании как-то где-то использовать. Пустая писанина да, но с возможностью использования.
дак
C++
1
2
struct
{int x;};
мы тоже можем как-то где-то использовать, в вашем случае 2, например)
вы просто столкнулись с банальным частным случаем typedef...
так-то конечно зачем писать typedef int myint; если можно использовать int?
но не всегда же все так просто)
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
25.04.2013, 13:28  [ТС]
Цитата Сообщение от AntonChik Посмотреть сообщение
мы тоже можем как-то где-то использовать, в вашем случае 2, например)
вы просто столкнулись с банальным частным случаем typedef...
так-то конечно зачем писать typedef int myint; если можно использовать int?
но не всегда же все так просто)
Не понимаю.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.04.2013, 15:12
Подсказка кодом со stackoverflow:
I can do this in c++/g++:

C++
1
2
3
4
5
6
7
8
struct vec3 { 
    union {
        struct {
            float x, y, z;
        }; 
        float xyz[3];
    }; 
};
Then,

C++
1
2
3
4
vec3 v;
assert(&v.xyz[0] == &v.x);
assert(&v.xyz[1] == &v.y);
assert(&v.xyz[2] == &v.z);
will work.
А еще почитайте про анонимные структуры, например:
Anonymous Structs
Last updated Sep 16, 2011.

Unlike anonymous unions, which are officially defined in the C++ standard, C++ also supports anonymous structs unofficially. Find out about this feature and its uses in the following sections.

What's an Anonymous Struct?
Recall that an anonymous union -- a feature that has been valid in C++ since its early days-- looks like this:

C++
1
2
3
4
5
6
union //no tag name
{
int a;
int b;
char* p;
}; //no object name
C1X adopted anonymous unions from C++ and extended this notion further -- in addition to anonymous unions, it also supports anonymous structures. From my experience, most exiting C++ implementations also support anonymous structs even though they are not officially recognized by the C++11 standard. First, let's look at such a struct:

C++
1
2
3
4
5
6
7
8
class C
{
public:
struct {int x; int y;};
C() x(0), y(0) {}
};
C c;
c.x=5;
Notice that an anonymous struct doesn't have a tag name or a named instance. By contrast, a struct declaration without a tag name that looks like this isn't an anonymous struct:

C++
1
2
3
4
5
6
class C
{
public:
struct {int x; int y;} *p; //not anonymous
struct {int a; char b;} n; //not anonymous
};
As with anonymous unions, the members of an anonymous struct are considered to be members of the containing structure, union or class. This applies recursively if the containing structure or union is also anonymous:

C++
1
2
3
4
5
6
7
8
class C
{
public:
union {int x; int y; 
  union {int z;}; };  //a nested anonymous union
};
C c;
c.x=c.z=0;
Yet unlike anonymous unions, each member of an anonymous struct occupies a distinct memory address. Technically, a class with an embedded anonymous struct is implemented as if the data members were declared directly inside the class. Thus, the following class:

C++
1
2
3
4
5
class C
{
public:
struct {int x; int y;};
};
is interchangeable with the following class for most purposes:

C++
1
2
3
4
5
6
class D
{
public:
int x; 
int y;
};
However, the alignment of the anonymous struct might affect the layout of the data members in class C. Therefore, the binary layout of classes C and D above needn't be identical.

Additional Restrictions
I have to emphasize again that standard C++11 doesn't recognize anonymous structs so the rules aren't clear-cut. However, it's safe to say that an anonymous struct can not define any special member functions. Similarly, you can't define static data members in an anonymous struct. Finally, an anonymous struct cannot define member functions. These restrictions are derived from similar restrictions that apply to anonymous unions. Finally, the members of an anonymous struct or union are implicitly declared public. Any other access type is not allowed:

C++
1
2
union {public: int x; int y; //OK
  union {private: int z;}; }; //error, private members aren't allowed
Obviously, you can combine anonymous unions and structs. The following example (taken from the C1X draft with slight modifications) demonstrates that:

C++
1
2
3
4
5
6
7
8
9
10
struct S {
union { // anonymous union
struct { int i, j; }; //embedded  anonymous structure
struct { long k, l; } w; //not anonymous
};
int m;
} s1;
s1.i = 2; // valid
s1.k = 3; // invalid: inner structure is not anonymous
s1.w.k = 5; // valid
Usage
Frankly, anonymous struct seem less useful than anonymous unions. It's not exactly an indispensable feature that will make your code look nicer or run faster. However, it is useful in applications that use machine-generated code. For example, an anonymous struct can map directly to a remote database record. Similarly, it could be useful when the name of the struct is dynamic and changes with every database transaction. More importantly, as trivial as it may seem, an anonymous struct is a feature you might stumble upon every now and then. Now you'll know what it looks like.
Взято отсюда - Anonymous Structs.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.04.2013, 15:12
Помогаю со студенческими работами здесь

List<struct> как выводить поля структуры в массив
class Music { List&lt;structMp3FileInfoPlaylist&gt; listmp3fileinfoplaylist = new List&lt;structMp3FileInfoPlaylist&gt;(); ...

чё это за переопределение такое структуры ? template <> struct Factorial<0>
Template &lt;int N&gt; struct Factorial { enum { value = N * Factorial&lt;N - 1&gt;::value }; }; template &lt;&gt; struct Factorial&lt;0&gt; ...

Что означает слово struct внутри объявления структуры?
Допустим объявляю структуру следующим образом: struct element{ int id; struct element* next; }; Что означает в данном...

TMemoryStream & Struct, как читать/писать структуры из/в поток?
на ++ пытаюсь перейти недавно... на С, задача была тривиальной и решена давно, но по обстоятельствам нужно перенести на С++. на...

Программа выдает ошибку при выводе структуры в функции Vyvod(int N, struct vehicle*mass)
#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstdlib&gt; #include&lt;fstream&gt; #include &lt;iomanip&gt; using namespace std; struct...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru