By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,889 Members | 1,259 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,889 IT Pros & Developers. It's quick & easy.

Setting union member in structure

P: n/a
I am having a syntax issue that I hope someone else here knows how to
rectify...

I am loading an INI file and have a simple function to load values from
it. The function is overloaded with the different return types int,
double or string. A structure is defined:

typedef struct INI_KEY {
char strCategory[32];
char strKey[32];

union {
int iDefaultValue;
double dDefaultValue;
char strDefaultValue[32];
} def;
} INI_KEY;

In the implementation is a global array of INI_KEY's that list off
various categories, keys and their default value (the value to return if
it isn't in the INI):

const INI_KEY g_keys[] = {
{ "category", "keyInt", 0 },
{ "category", "keyDouble", 0.0 },
{ "category", "keyString", "foo" },
// ...
};

The problem I'm having is in the default value of the global array. The
compiler is trying to convert the double and string values to integers
and generating compiler errors. I'm sure there is a syntax to tell the
compiler what member of the union to use, I just don't know it. If it
makes a difference, I'm using MS VC++ 7.

--
Best regards,
Jeff jma[at]mfire.com
http://www.jm-basic.com
Jul 22 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a

"Jeff Massung" <jm*@NOSPAM.mfire.com> wrote in message
news:vu************@corp.supernews.com...
I am having a syntax issue that I hope someone else here knows how to
rectify...

I am loading an INI file and have a simple function to load values from
it. The function is overloaded with the different return types int,
double or string. A structure is defined:

typedef struct INI_KEY {
char strCategory[32];
char strKey[32];

union {
int iDefaultValue;
double dDefaultValue;
char strDefaultValue[32];
} def;
} INI_KEY;

In the implementation is a global array of INI_KEY's that list off
various categories, keys and their default value (the value to return if
it isn't in the INI):

const INI_KEY g_keys[] = {
{ "category", "keyInt", 0 },
{ "category", "keyDouble", 0.0 },
{ "category", "keyString", "foo" },
// ...
};

The problem I'm having is in the default value of the global array. The
compiler is trying to convert the double and string values to integers
and generating compiler errors. I'm sure there is a syntax to tell the
compiler what member of the union to use,
There is not.
I just don't know it. If it
makes a difference, I'm using MS VC++ 7.


================================================== ===================
ISO/IEC 14882:1998(E)

8.5.1 Aggregates

[....]

15 When a union is initialized with a brace*-enclosed initializer,
the braces shall only contain an initializer for the first member
of the union. [Example:

union u { int a; char* b; };
u a = { 1 };
u b = a;
u c = 1; // error
u d = { 0, "asdf" }; // error
u e = { "asdf" }; // error

--end example] [Note: as described above, the braces around the
initializer for a union member can be omitted if the union is
a member of another aggregate. ]
================================================== ===================

-Mike
Jul 22 '05 #2

P: n/a
"Mike Wahler" <mk******@mkwahler.net> wrote in
news:c5****************@newsread2.news.pas.earthli nk.net:

"Jeff Massung" <jm*@NOSPAM.mfire.com> wrote in message
news:vu************@corp.supernews.com...

const INI_KEY g_keys[] = {
{ "category", "keyInt", 0 },
{ "category", "keyDouble", 0.0 },
{ "category", "keyString", "foo" },
// ...
};

The problem I'm having is in the default value of the global array.
The compiler is trying to convert the double and string values to
integers and generating compiler errors. I'm sure there is a syntax
to tell the compiler what member of the union to use,


There is not.

================================================== ===================
ISO/IEC 14882:1998(E)

8.5.1 Aggregates

[....]

15 When a union is initialized with a brace*-enclosed initializer,
the braces shall only contain an initializer for the first member
of the union. [Example:

union u { int a; char* b; };
u a = { 1 };
u b = a;
u c = 1; // error
u d = { 0, "asdf" }; // error
u e = { "asdf" }; // error

--end example] [Note: as described above, the braces around the
initializer for a union member can be omitted if the union is
a member of another aggregate. ]
================================================== ===================

-Mike


Oh well. Thanks for the quick reply.

--
Best regards,
Jeff jma[at]mfire.com
http://www.jm-basic.com
Jul 22 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.