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

g++ "offsetof" problem

P: n/a
Hello.

I wrote a program, but g++ warns
a.c:11: warning: invalid access to non-static data member `A::y' of NULL object
a.c:11: warning: (perhaps the `offsetof' macro was used incorrectly)

The program is like below.

class A
{
private:
int x;
int y;
public:
static unsigned int const y_offset;
};

unsigned int const A::y_offset = (
reinterpret_cast<char *>(&static_cast<A *>(0)->y)
-
static_cast<char *>(0)
);

I want to define a constant like A::y_offset with g++ without warnings.
Is it possible?

Thank you in advance.

//Hiroki Horiuchi
Jul 22 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Hiroki Horiuchi wrote:
Hello.

I wrote a program, but g++ warns
a.c:11: warning: invalid access to non-static data member `A::y' of
NULL object a.c:11: warning: (perhaps the `offsetof' macro was used
incorrectly)

The program is like below.

class A
{
private:
int x;
int y;
public:
static unsigned int const y_offset;
};

unsigned int const A::y_offset = (
reinterpret_cast<char *>(&static_cast<A *>(0)->y)
-
static_cast<char *>(0)
);

I want to define a constant like A::y_offset with g++ without
warnings.
Is it possible?


Nope. offsetof is only valid for C structs. You will need to rethink your
design.

--
Attila aka WW
Jul 22 '05 #2

P: n/a
Hiroki Horiuchi wrote in
news:85**************************@posting.google.c om:
Hello.

I wrote a program, but g++ warns
a.c:11: warning: invalid access to non-static data member `A::y' of
NULL object a.c:11: warning: (perhaps the `offsetof' macro was used
incorrectly)

The program is like below.

class A
{
private:
int x;
int y;
public:
static unsigned int const y_offset;
};

unsigned int const A::y_offset = (
reinterpret_cast<char *>(&static_cast<A *>(0)->y)
-
static_cast<char *>(0)
);
static_cast<A *>(0) is NULL pointer you may not dereference it any
portable way. Note the Standard says that the inbult operator ->
derefences the pointer that its applied to, so it does even though
all you do is take an address.

I want to define a constant like A::y_offset with g++ without
warnings. Is it possible?


Look into the offsetof macro and use it correctly,

#include <iostream>
#include <cstdlib>

/* struct/class must be a POD (Plain Old Data) to be
sutable for use with offsetof
*/
struct A_POD
{
int x;
int y;
int z;
};

class A : private A_POD
{
public:

int &operator [] ( unsigned off );

static unsigned int const offset[ 3 ];

A( int xx, int yy, int zz )
{
x = xx;
y = yy;
z = zz;
}
};

unsigned int const A::offset[ 3 ] =
{
offsetof( A_POD, x ),
offsetof( A_POD, y ),
offsetof( A_POD, z )
};
int & A::operator [] ( unsigned off )
{
return *reinterpret_cast< int * >(
reinterpret_cast< char * >(
static_cast< A_POD * >( this )
)
+
offset[ off ]
);
}
int main()
{
A a( 1, 2, 3 );

std::cerr
<< a[ 0 ] << "\n"
<< a[ 1 ] << "\n"
<< a[ 2 ] << "\n"
;
}

HTH

Rob.
--
http://www.victim-prime.dsl.pipex.com/
Jul 22 '05 #3

P: n/a
On 25 Nov 2003 04:48:40 -0800, hi****@air.ne.jp (Hiroki Horiuchi)
wrote:
Hello.

I wrote a program, but g++ warns
a.c:11: warning: invalid access to non-static data member `A::y' of NULL object
a.c:11: warning: (perhaps the `offsetof' macro was used incorrectly)

The program is like below.

class A
{
private:
int x;
int y;
public:
static unsigned int const y_offset;
};

unsigned int const A::y_offset = (
reinterpret_cast<char *>(&static_cast<A *>(0)->y)
-
static_cast<char *>(0)
);

I want to define a constant like A::y_offset with g++ without warnings.
Is it possible?


Possibly, but it isn't portable anyway. offsetof can only be used with
POD types (which can't have private data). This compiles without
warnings:

#include <stddef.h>

class A
{
public:
int x;
int y;
static unsigned int const y_offset;
};

unsigned int const A::y_offset = offsetof(A, y);

Tom
Jul 22 '05 #4

P: n/a

"Hiroki Horiuchi" <hi****@air.ne.jp> wrote in message news:85**************************@posting.google.c om...
Hello.

I wrote a program, but g++ warns
a.c:11: warning: invalid access to non-static data member `A::y' of NULL object
a.c:11: warning: (perhaps the `offsetof' macro was used incorrectly)

It's undefiend to use offsetof on non-POD's.
Jul 22 '05 #5

P: n/a
Hiroki Horiuchi wrote:
Hello.

I wrote a program, but g++ warns
a.c:11: warning: invalid access to non-static data member `A::y' of NULL object
a.c:11: warning: (perhaps the `offsetof' macro was used incorrectly)

The program is like below.

class A
{
private:
int x;
int y;
public:
static unsigned int const y_offset;
};

unsigned int const A::y_offset = (
reinterpret_cast<char *>(&static_cast<A *>(0)->y)
-
static_cast<char *>(0)
);

I want to define a constant like A::y_offset with g++ without warnings.
Is it possible?

Thank you in advance.

//Hiroki Horiuchi


You can't get the "offset" of it, but you could do something like this:

class A
{
private:
int x;
int y;
public:
static int A::* y_offset;
}

int A::* A::y_offset = &A::y;
Jul 22 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.