[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Caveat with lua_pushlightuserdata(L, (void *)&key)
- From: Glenn Maynard <glenn@...>
- Date: Mon, 26 Jun 2006 23:43:01 -0400
On Mon, Jun 26, 2006 at 11:33:37AM +0100, David Jones wrote:
>
> On 26 Jun 2006, at 09:33, Andreas Stenius wrote:
>
> >Julien Cugnière skrev:
> >>Anyway, here is a simple way to ensure that your constants are unique
> >>(assuming this legal C):
> >> static const void* regkey1 = ®key1;
> >> static const void* regkey2 = ®key2;
> >
> >No, ®key1 is not a constant expression, although the result is
> >constant.
>
> Doesn't matter. In C it's legal (though probably stupid) to take a
> pointer to a const object and convert it to a pointer to a non-const
> object. No idea about C++. Just one of the many ways in which const
> is broken and surprises programmers.
Without getting into an extended debate, I'd suggest that anyone reading
this and thinking about not using const get a better understanding of
it. Remember that it's just another type safety mechanism; it's there
for programmers, not the compiler; like most type safety mechanisms, it
can be overridden, but be sure it makes sense to do so. Don't expect
const to improve optimization; that's not what it's for. (And always
compile your C programs in gcc with "-Wwrite-strings", so string constants
are const. g++ does this by default.)
I'm not sure if the problem here is a bug in Apple's version of GCC
or just an incorrect assumption about pointer uniqueness; that said, I
wonder if simply using eg. "volatile const int i = 1;" would work around
the problem. It would impact optimization of accessing "i", but since
only the pointer is used, that shouldn't matter; and it may tip the
compiler that it can't merge it with other variables. If it's a
compiler bug, maybe there's a flag to disable it.
--
Glenn Maynard