* [Bug c++/45082] Static const signed int class member causes undefined symbol.
2010-07-26 15:25 [Bug c++/45082] New: Static const signed int class member causes undefined symbol rwitmer at xmission dot com
@ 2010-07-26 15:32 ` jakub at gcc dot gnu dot org
2010-07-26 15:59 ` rwitmer at xmission dot com
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: jakub at gcc dot gnu dot org @ 2010-07-26 15:32 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from jakub at gcc dot gnu dot org 2010-07-26 15:32 -------
This is not valid C++. See [class.static.data]/4:
If a static data member is of const integral or const enumeration type, its
declaration in the class definition can specify a constant-initializer which
shall be an integral constant expression (5.19). In that case, the member can
appear in integral constant expressions within its scope. The member shall
still be defined in a namespace scope if it is used in the program and the
namespace scope definition shall not contain an initializer.
Your testcase doesn't have the needed
const int myclass::BUFF_SIZE;
anywhere.
--
jakub at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |INVALID
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/45082] Static const signed int class member causes undefined symbol.
2010-07-26 15:25 [Bug c++/45082] New: Static const signed int class member causes undefined symbol rwitmer at xmission dot com
2010-07-26 15:32 ` [Bug c++/45082] " jakub at gcc dot gnu dot org
@ 2010-07-26 15:59 ` rwitmer at xmission dot com
2010-07-26 16:33 ` redi at gcc dot gnu dot org
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: rwitmer at xmission dot com @ 2010-07-26 15:59 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from rwitmer at xmission dot com 2010-07-26 15:59 -------
I agree with your assessment. Adding const int myclass::BUFF_SIZE; resolves
the issue.
The bug/feature may be that re-typing BUFF_SIZE to static const unsigned int
allows the compiler to not report a problem. It doesn't require a const
unsigned myclass::BUFF_SIZE; anywhere and still compiles when it shouldn't.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/45082] Static const signed int class member causes undefined symbol.
2010-07-26 15:25 [Bug c++/45082] New: Static const signed int class member causes undefined symbol rwitmer at xmission dot com
2010-07-26 15:32 ` [Bug c++/45082] " jakub at gcc dot gnu dot org
2010-07-26 15:59 ` rwitmer at xmission dot com
@ 2010-07-26 16:33 ` redi at gcc dot gnu dot org
2010-07-26 16:37 ` redi at gcc dot gnu dot org
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: redi at gcc dot gnu dot org @ 2010-07-26 16:33 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from redi at gcc dot gnu dot org 2010-07-26 16:32 -------
(In reply to comment #2)
> The bug/feature may be that re-typing BUFF_SIZE to static const unsigned int
> allows the compiler to not report a problem.
You're not "re-typing" it, you're providing a definition for a variable that
was previously only declared, not defined.
> It doesn't require a const
> unsigned myclass::BUFF_SIZE; anywhere
Yes it does, it requires it where you bind a reference to the variable.
If you only want it to be used as an integral constant, don't use it in a
context that requires a variable (e.g. reference binding)
> and still compiles when it shouldn't.
There are dozens of (invalid) bug reports in bugzilla about this, feel free to
search for more details.
The compiler must not reject your program as it doesn't know until link time
that you've failed to define the symbol. It could be defined in some other
object or library that you link to later.
The bug was in your program, not the compiler.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/45082] Static const signed int class member causes undefined symbol.
2010-07-26 15:25 [Bug c++/45082] New: Static const signed int class member causes undefined symbol rwitmer at xmission dot com
` (2 preceding siblings ...)
2010-07-26 16:33 ` redi at gcc dot gnu dot org
@ 2010-07-26 16:37 ` redi at gcc dot gnu dot org
2010-07-27 15:27 ` rwitmer at xmission dot com
2010-07-27 23:55 ` redi at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: redi at gcc dot gnu dot org @ 2010-07-26 16:37 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from redi at gcc dot gnu dot org 2010-07-26 16:37 -------
(In reply to comment #3)
>
> If you only want it to be used as an integral constant, don't use it in a
> context that requires a variable (e.g. reference binding)
e.g.
funky((int)myclass::BUFF_SIZE);
This means the reference binds to a temporary, not to your class variable, and
therefore the compiler only needs the value of BUFF_SIZE, not it's definition.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/45082] Static const signed int class member causes undefined symbol.
2010-07-26 15:25 [Bug c++/45082] New: Static const signed int class member causes undefined symbol rwitmer at xmission dot com
` (3 preceding siblings ...)
2010-07-26 16:37 ` redi at gcc dot gnu dot org
@ 2010-07-27 15:27 ` rwitmer at xmission dot com
2010-07-27 23:55 ` redi at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: rwitmer at xmission dot com @ 2010-07-27 15:27 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from rwitmer at xmission dot com 2010-07-27 15:27 -------
Thanks for all the great comments and insight.
I'm still confused as to why when the BUFF_SIZE was defined as:
static const signed int BUFF_SIZE = 20;
it caused the error, but when it was defined as:
static const unsigned int BUFF_SIZE = 20;
it did not.
void funky(const int& in) is an example of a library call I had to use, I have
no control over the author's over zealousness on using a const int& parameter.
There were 2 things that solved the problem I was seeing:
1. Adding a const signed int BUFF_SIZE; line to the .cpp file.
I've seen lots of code where we define constants ala, static const int
BUFF_SIZE=20; in the .hpp file without any const int myclass::BUFF_SIZE; in the
.cpp files. Is that wrong to exclude them, should we be including them in the
.cpp file?
2. Declaring the type during the call, ala, funky((int)myclass::BUFF_SIZE);
I'm not sure which is the better solution.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/45082] Static const signed int class member causes undefined symbol.
2010-07-26 15:25 [Bug c++/45082] New: Static const signed int class member causes undefined symbol rwitmer at xmission dot com
` (4 preceding siblings ...)
2010-07-27 15:27 ` rwitmer at xmission dot com
@ 2010-07-27 23:55 ` redi at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: redi at gcc dot gnu dot org @ 2010-07-27 23:55 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from redi at gcc dot gnu dot org 2010-07-27 23:54 -------
(In reply to comment #5)
> Thanks for all the great comments and insight.
>
> I'm still confused as to why when the BUFF_SIZE was defined as:
> static const signed int BUFF_SIZE = 20;
> it caused the error, but when it was defined as:
> static const unsigned int BUFF_SIZE = 20;
> it did not.
Because you can't bind const int& to an unsigned int, so a temporary is created
and the reference bound to that. When the variable has type int the reference
can bind to it directly.
> There were 2 things that solved the problem I was seeing:
>
> 1. Adding a const signed int BUFF_SIZE; line to the .cpp file.
>
> I've seen lots of code where we define constants ala, static const int
> BUFF_SIZE=20; in the .hpp file without any const int myclass::BUFF_SIZE; in the
> .cpp files. Is that wrong to exclude them, should we be including them in the
> .cpp file?
Yes, if the variable is "used" in the program, see the reference from the
standard that Jakub posted days ago in comment 1
> 2. Declaring the type during the call, ala, funky((int)myclass::BUFF_SIZE);
You might have misunderstood that as well, there's no "declaring the type"
there, it's creating a temporary which the reference binds to.
> I'm not sure which is the better solution.
Again, please follow up somewhere else, GCC's bugzilla is not the right place
to learn the rules of C++.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
^ permalink raw reply [flat|nested] 7+ messages in thread