[Bug c++/45082] New: Static const signed int class member causes undefined symbol.
A class that has a static const signed int data member when passed to a function as a const int& parameter will cause the data member to be an undefined symbol. If the static const signed int data member is re-typed as const unsigned int the error goes away. I've verified this on g++ 3.4.6 and 4.1.2. The following code example illustrates the error. #include static const signed int GLOBAL_BUFF_SIZE=30; class myclass { public: static const int BUFF_SIZE = 20; // Causes linker error. //static const signed int BUFF_SIZE = 20; // Causes linker error. //static const unsigned int BUFF_SIZE = 20; // No linker error. static const int ANOTHER_BUFF_SIZE; int myArray[BUFF_SIZE]; /* Linker error. % g++ static2.cpp Undefined first referenced symbol in file myclass::BUFF_SIZE /var/tmp//cc2IHYwP.o ld: fatal: Symbol referencing errors. No output written to a.out collect2: ld returned 1 exit status % g++ --version g++ (GCC) 3.4.6 and g++ (GCC) 4.1.2 % ccppc --version ccppc (Wind River VxWorks G++ DWARF-EH 4.1-131) 4.1.2 */ }; // This solves the linker problem. // Not an option for me. I need to dimension an array with BUFF_SIZE. const int myclass::ANOTHER_BUFF_SIZE=20; // Function that takes a constant reference to an integer. // When a static const signed int is passed to this function // that was defined in a class, you get the linker error. // If that static const is declared unsigned int, you dont get the error. // When the reference is to a global static, there is no error. void funky(const int& in) { printf("What came into funky() was %d\n", in); } int main() { printf("%d\n", myclass::BUFF_SIZE); // This doesn't cause the error. funky(myclass::BUFF_SIZE); // This line causes the error. funky(myclass::ANOTHER_BUFF_SIZE); // This doesn't cause the error. funky(GLOBAL_BUFF_SIZE); // This doesn't cause the error. } -- Summary: Static const signed int class member causes undefined symbol. Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rwitmer at xmission dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45082
[Bug c++/45082] Static const signed int class member causes undefined symbol.
--- 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
[Bug c++/45082] Static const signed int class member causes undefined symbol.
--- 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