|
Using Macros To Keep Data In Sync
Submitted by |
If you've ever needed to keep multiple arrays of constant information in
sync then this COTD tip is for you.
For example - here is a snippet from an imaginary profiler which needs to
keep an enum,
an array of strings for names and an array of budgets in sync:
In ProfileItem.h....
enum ProfileItem
{
ProfileItem_Render,
ProfileItem_Simulation,
//Add new profile item here.
ProfileItem_Max
}; |
And in ProfileItem.cpp...
const char * profileName[ProfileItem_Max] =
{
"Render",
"Simulation"
//Add description for profile item here.
};
const int Budget[ProfileItem_Max] =
{
10,
12
//Add budget for profile item here.
}; |
The above code can easily go out of sync unless everyone on a team is very
careful and always adds new
items to all three areas in exactly the same order.
An alternative to the above is to use the following technique:
In ProfileItemX.h....
XM(Render, 10)
XM(Simulation,12)
//Add new profile item and budget here...use format XM(item, budget) |
Now in ProfileItem.h....
enum ProfileItem
{
#define XM(profileItem, budget) ProfileItem_##profileItem,
#include "ProfileItemX.h"
#undef XM
ProfileItem_Max
}; |
And in ProfileItem.cpp...
const char * profileName[ProfileItem_Max] =
{
#define XM(profileItem, budget) #ProfileItem,
#include "ProfileItemX.h"
#undef XM
};
const int Budget[ProfileItem_Max] =
{
#define XM(profileItem, budget) ##budget,
#include "ProfileItemX.h"
#undef XM
}; |
Now you and your team only need to change one line of code to add a
new profile item and macro's keep everything in sync, leaving much less
chance for error.
Thanks to Matt Curtis for introducing me to this technique.
|
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
|