Setting union member in structure

J

Jeff Massung

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.
 
M

Mike Wahler

Jeff Massung said:
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
 
J

Jeff Massung

Jeff Massung said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top