Мало того, что это работает где-нибудь, но это может привести к некоторым интересным методам. Вот пример, который генерирует перечисление и соответствующую таблицу строк, которые гарантированно синхронизируются.
Animals.h:
ANIMAL(Anteater)
ANIMAL(Baboon)
...
ANIMAL(Zebra)
AnimalLibrary.h:
#define ANIMAL(name) name,
enum Animals {
#include "Animals.h"
AnimalCount
};
#undef ANIMAL
extern char * AnimalTable[AnimalCount];
AnimalLibrary.cpp:
#include "AnimalLibrary.h"
#define ANIMAL(name) #name,
char * AnimalTable[AnimalCount] = {
#include "Animals.h"
};
main.cpp:
#include "AnimalLibrary.h"
int main()
{
cout << AnimalTable[Baboon];
return 0;
}
Убедитесь, что обычные включающие охранники не включены ни в один файл, который будет включен несколько раз!
Должен согласиться с Уильямом Перселлом , хотя в этой технике люди будут чесать свои головы.