union LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} dblPart;
LONGLONG QuadPart;
};
Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так:
LARGE_INTEGER value = {{1, 1}};
или более коротко:
LARGE_INTEGER value = {1, 1};
Но ИМХО первый способ выразительнее.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как правильно инициализировать объединения?
От:
Аноним
Дата:
29.01.08 13:00
Оценка:
Здравствуйте, Bell, Вы писали:
B>Во-первых, в объединении не хватает переменной:
Странно, но и без переменной все компилится
B>Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так: B>... B>Но ИМХО первый способ выразительнее.
Спасибо. Собственно меня и интересовало как можно инициализировать второе поле
Re[2]: Как правильно инициализировать объединения?
От:
Аноним
Дата:
29.01.08 13:05
Оценка:
Здравствуйте, Bell, Вы писали:
Еще один вопрос про
B>LARGE_INTEGER value = {{1, 1}};
B>LARGE_INTEGER value = {1, 1};
Правильно ли, по примеру массивов (если нужно инициализировать нулем), инициализировать так:
LARGE_INTEGER value = {0};
или даже может так:
LARGE_INTEGER value = {};
Re[3]: Как правильно инициализировать объединения?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Bell, Вы писали:
B>>Во-первых, в объединении не хватает переменной: А>Странно, но и без переменной все компилится
VC7.1 действительно компилит, а вот Комо — нет.
B>>Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так: B>>... B>>Но ИМХО первый способ выразительнее. А>Спасибо. Собственно меня и интересовало как можно инициализировать второе поле
Если имеется ввиду поле QuadPart — то перенеси его на первое место, и будет тебе счастье:
LARGE_INTEGER value = {1000000000000};
Любите книгу — источник знаний (с) М.Горький
Re[3]: Как правильно инициализировать объединения?
Здравствуйте, Аноним, Вы писали:
А>Еще один вопрос про А>
B>>LARGE_INTEGER value = {{1, 1}};
B>>LARGE_INTEGER value = {1, 1};
А>
А>Правильно ли, по примеру массивов (если нужно инициализировать нулем), инициализировать так: А>
А>LARGE_INTEGER value = {0};
А>или даже может так:
А>LARGE_INTEGER value = {};
А>
А>
Да.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Как правильно инициализировать объединения?
От:
Аноним
Дата:
29.01.08 13:47
Оценка:
Здравствуйте, Bell, Вы писали:
вот у меня такой вопрос есть union и когда я иницализирую LARGE_INTEGER u = {{1,3}}; то у меня переменная long_second; инизиализируется значением 1? если я меняю тип long на допустим double то запис. какой то мусор или это немусор(6.365987375366e-314#DEN)
union LARGE_INTEGER
{
struct
{
int i_int;
long long_first;
}dbPart;
long long_second;
};
Re[5]: Как правильно инициализировать объединения?
А>union LARGE_INTEGER
А>{
А> struct
А> {
А> int i_int;
А> long long_first;
А> }dbPart;
А> long long_second;
А>};
А>
А>вот у меня такой вопрос есть union и когда я иницализирую LARGE_INTEGER u = {{1,3}}; то у меня переменная long_second; инизиализируется значением 1?
Вообще говоря нет. Для данного примера можно гарантировать, что dbPart.i_int == 1, и dbPart.long_first == 3. Если представление long и int совпадает, то обе переменные i_int и long_second имеют один и тот же адрес и размер, и dbPart.i_int == long_second == 1
А>...если я меняю тип long на допустим double то запис. какой то мусор или это немусор(6.365987375366e-314#DEN)
Размер int и double не совпадает, поэтому получается то, что получается.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Как правильно инициализировать объединения?
От:
Аноним
Дата:
30.01.08 10:24
Оценка:
Здравствуйте, Bell, Вы писали:
А>>
А>>LARGE_INTEGER value = {0};
А>>LARGE_INTEGER value = {};
А>>
а что означает в таких случаях опущенная инициализация членов структуры?
(т.е. каким образом в привиденных примерах инициализируются опущенные члены структуры)
смотрел стандарт, смотрел и не нашел
Re[5]: Как правильно инициализировать объединения?
А>а что означает в таких случаях опущенная инициализация членов структуры? А>(т.е. каким образом в привиденных примерах инициализируются опущенные члены структуры)
А>смотрел стандарт, смотрел и не нашел
8.5.1/7
If there are fewer initializers in the list than there are members in the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5). [Example:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form
int(), that is, 0. ]
8.5/5
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized
Любите книгу — источник знаний (с) М.Горький
Re[4]: Как правильно инициализировать объединения?
От:
Аноним
Дата:
31.01.08 13:53
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, Bell, Вы писали:
B>>>Во-первых, в объединении не хватает переменной: А>>Странно, но и без переменной все компилится B>VC7.1 действительно компилит, а вот Комо — нет.
B>>>Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так: B>>>... B>>>Но ИМХО первый способ выразительнее. А>>Спасибо. Собственно меня и интересовало как можно инициализировать второе поле B>Если имеется ввиду поле QuadPart — то перенеси его на первое место, и будет тебе счастье:
Мне кажется более правильно сделать инициализацию через конструтор:
union LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} dblPart;
LONGLONG QuadPart;
LARGE_INTEGER(LONGLONG val = 0) : QuadPart(val) {}
LARGE_INTEGER(DWORD val1, LONG val2)
{
dblPart.LowPart = val1; dblPart.HighPart = val2;
}
};
LARGE_INTEGER value(10000000);