initialize static structured variable challenge

W

wim delvaux

Hi all,

I want to initialize two structures with pointers
to eachother

static StructA VarA = { PtrToVarB };
static StructB VarB = { PtrToVarA };

A solution that WORKS in C (using gcc 3.3) is

static StructA VarA; // defining VarA
static StructB VarB; // defining VarB

and then

static StructA VarA = { &VarB };
static StructB VarB = { &VarA };

However in C++ (same gcc version) it does not work because
the first static is not assumed to be tentative.

How can I solve this problem ? Initializing using
functions is not possible since the above code is
generated automatically by some compiler

W
 
G

Gianni Mariani

wim said:
Hi all,

I want to initialize two structures with pointers
to eachother

static StructA VarA = { PtrToVarB };
static StructB VarB = { PtrToVarA };

A solution that WORKS in C (using gcc 3.3) is

static StructA VarA; // defining VarA
static StructB VarB; // defining VarB

and then

static StructA VarA = { &VarB };
static StructB VarB = { &VarA };

However in C++ (same gcc version) it does not work because
the first static is not assumed to be tentative.

How can I solve this problem ? Initializing using
functions is not possible since the above code is
generated automatically by some compiler

namespace
{
extern StructA VarA;
extern StructB VarB;

StructA VarA = { &VarB };
StructB VarB = { &VarA };
};

I didn't test it, but the above should compile. Note that the "extern"
in an anonymous namespace has about the same meaning as static.
 
W

wim delvaux

namespace {
typedef struct x_s {
int x;
} x_t;

extern x_t X1;
extern x_t X2;

static x_t X1 = { &X2 };
static x_t X2 = { &X1 };
}

Compiled above code ...

u19809@buro:.../tmp$ c++ --version
c++ (GCC) 3.3.3 (Debian 20040417)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Result :

u19809@buro:.../tmp$ c++ t.c -o t++
t.c:9: error: `<unnamed>::X1' was declared `extern' and later `static'
t.c:6: error: previous declaration of `<unnamed>::X1'
t.c:9: error: invalid conversion from `<unnamed>::x_t*' to `int'
t.c:10: error: `<unnamed>::X2' was declared `extern' and later `static'
t.c:7: error: previous declaration of `<unnamed>::X2'
t.c:10: error: invalid conversion from `<unnamed>::x_t*' to `int'
 
B

Buster

wim delvaux wrote:

What you tried is totally different from what Gianni suggested.
The 'static' keyword has managed to sneak back in. I compiled
the following, as a complete translation unit. There were no
errors on GCC 3.3.1, MSVC 7.1 or BCB 6.0.

namespace
{
struct StructB;
struct StructA { StructB * p; };
struct StructB { StructA * p; };

extern StructA VarA;
extern StructB VarB;

StructA VarA = { &VarB };
StructB VarB = { &VarA };
};

void f()
{
StructA a;
StructB b;
}
 
W

wim delvaux

Ah ok,

one thing I am afraid of is that VarA and VarB should remain local
variables (i.e. not cause nameclashes in other modules).

Does the use of the anonymous namespace imply that the vars are hidden for
all other source files ?

W
 
G

Gianni Mariani

wim said:
Ah ok,

one thing I am afraid of is that VarA and VarB should remain local
variables (i.e. not cause nameclashes in other modules).

Does the use of the anonymous namespace imply that the vars are hidden for
all other source files ?

yes - (modulo compiler bugs).
 

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,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top