[Bug c++/31904] fail to link to static const double

dennis0yang at gmail dot com gcc-bugzilla@gcc.gnu.org
Sat May 12 16:19:00 GMT 2007



------- Comment #6 from dennis0yang at gmail dot com  2007-05-12 17:19 -------
Subject: Re:  fail to link to static const double

I understand perfectly well everything you said. But I think you miss 
the point of this bug report.
This is not about the c++ standard in terms of what should and should 
not be done. This is about get rid of the "luck" component in gcc. If 
gcc decides not to support in-class definition for static const double, 
then flag the statement as an error. I really don't see why the compile 
doesn't substitute the value everywhere it see the reference (as you 
mentioned), because it is a static const!

fang at csl dot cornell dot edu wrote:
> ------- Comment #5 from fang at csl dot cornell dot edu  2007-05-12 16:53 -------
> Subject: Re:  fail to link to static const double
>
>   
>> ------- Comment #3 from dennis0yang at gmail dot com  2007-05-12 09:29 -------
>> Subject: Re:  fail to link to static const double
>>
>> I understand that the standard only specifies that static const for
>> integral type can be assigned within the class. My point is that if gcc
>> decides to allow the extension of assigning static const double within
>> the class (good extension, I don't see why this is not in the
>> standard.), then it should allow me to link to it. Note the code works
>> if I change "y=-x" to "y= -1 * x", so it is clearly a bug.
>>     
>
> To *link* to something correctly with a reference, you need EXACTLY ONE
> definition, same as in C.  An in-class declaration is not a definition.
> It cannot be treated as such because you'd end up with a definition in
> each translation unit that includes the header (multiply defined).  The
> cases in which the compile/link 'worked' for you were cases in which the
> compiler substituted the value for the reference (you got lucky).  I don't
> know the heuristics for the decision, maybe ask someone familiar with the
> constant-folding opt.
>
>   
>> I also tried your suggestion before submitting the bug report. It does
>> work. But I really do not want to create a .cpp file just to put that
>> one line in it, much prefer to leave everything in the .h file.
>>     
>
> Defining it once in a .cpp file is the correct thing to do, even if it is
> inconvenient.
>
> Hope this helps.
>
>   
>> fang at csl dot cornell dot edu wrote:
>>     
>>> ------- Comment #1 from fang at csl dot cornell dot edu  2007-05-12 09:06 -------
>>> You need to define Base::x out of class in some translation unit, the in-class
>>> declaration alone isn't enough, though sometimes the compiler will elide the
>>> reference to it if its value is known (optimization).
>>>
>>> const double Base::x = 1.0;
>>>       
>
>
>   


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31904



More information about the Gcc-bugs mailing list