Hi, Need information on support of scoped enums in Keil compiler. My final objective is to use the Enums as AIAction:Enter</i or AIAction:Exit instead of plain Enter or Exit in the source code C files. This is to solve the global namespace pollution.
I have the following structure in header file :
struct AIAction{ enum AIActionType { Enter, Exit, Run, }; };
For using it, following is the code in C file (filetype is C)
int iType; iType = AIAction::Run;
When I compile this with current settings, it is giving me error #618: struct or union declares no named members
However, if I change the filetype to C++, it compiles successfully. So basically C++ compiler is allowing such structure definition.
From this, I infer that C has got limitation of not allowing any non-named members in structures.
How do I use the enums the way I want? Can this be achieved without using C++ compiler?
If you are willing to write AIAction::Run in all of the software, then you can just as well replace : with _ and write AIAction__Run.
It isn't actually the number of global symbol names that is a reason why global symbol names should be kept down. It's more the complexity of trying to figure out what symbol names are irrelevant when doing a specific operation.
That's also why a traditional C program normally uses function names that implies some form of namespace, so uart0_init(), uart0_send(), ... while the C++ code would instead have had an object uart0 with member methods.
Thanks Per for your reply and explanation.
Other than keeping the code less polluted with enums, I also intend to keep the enums in their own namespaces. This will actually help during code development without searching for Enum names. Your solution of affixing the EnumType_ will also work and feasible but then again code may not look that good.
I have developed C++ applications in Qt framework and really liked how the enums are handled in class scope. Same thing I wanted to implement with C and just learned that it is not possible with current Keil compiler.
So, either I implement your proposed solution in C or use the namespace like below and use the C++ compiler. I can also use the struct definition as in 1st post.
namespace AIAction { enum AIActionType { Enter, Exit, Run, }; }
Note that if it's enough to add a data member to the struct to make the compiler happy, then this will not cost you any memory space, since you do not intend to instantiate the struct.
Sorry Per. Didn't understand what you meant.
You complained about the error message: "When I compile this with current settings, it is giving me error #618: struct or union declares no named members"
If you modify to:
struct AIAction { enum AIActionType { Enter, Exit, Run, } dummy; // <= make sure there is a named member };
Then you do have a named member, so the compiler error message should go away. And it doesn't cost you any RAM, since you will not instantiate any variable of type struct AIAction.
Yes Per. I did that and I couldn't get anymore error. But then, I cannot use AIAction::Enter because then you will be required to create variable of struct AIAction type.
View all questions in Keil forum