KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I have recently discovered an annoying problem in some large program i am developing; i would like to understand how to fix it in a best way. I cut the code down to the following minimal example. #include <iostream> using std::cin; using std::cout; class MagicNumbers { public: static const int BIG = 100; static const int SMALL = 10; }; int main() { int choice; cout << "How much stuff do you want?\n"; cin >> choice; int stuff = (choice < 20) ? MagicNumbers::SMALL : MagicNumbers::BIG; // PROBLEM! cout << "You got " << stuff << "\n"; return 0; } I get link errors in gcc 4.1.2 when compiling with -O0 or -O1 but everything is OK when compiling with -O2 or -O3. It links well using MS Visual Studio 2005 regardless of optimization options. test.cpp:(.text+0xab): undefined reference to `MagicNumbers::SMALL' test.cpp:(.text+0xb3): undefined reference to `MagicNumbers::BIG' I looked at the intermediate assembly code, and yes, the non-optimized code regarded SMALL and BIG as external int variables, while the optimized one used the actual numbers. Each of the following changes fixes the problem: Use enum instead of int for constants: enum {SMALL = 10} Cast the constant (any one) at each usage: (int)MagicNumbers::SMALL or (int)MagicNumbers::BIG or even MagicNumbers::SMALL + 0 Use a macro: #define SMALL 10 Not use the choice operator: if (choice < 20) stuff = MagicNumbers::SMALL; else stuff = MagicNumbers::BIG; I like the first option best (however, it's not ideal because we actually use uint32_t instead of int for these constants, and enum is synonymous with int). But what i really want to ask is: whose bug is it? Am i the one to blame for no
Tags (comma-separated)
Save Edits
Cancel