#ifdef __cplusplus
#include <iostream>
#include "enum_n_e.h"
auto& operator<<(std::ostream& s, N::E e)
{
return s << static_cast<unsigned int>(e);
}
int main()
{
std::cout << "C++: " << N::E::E1 << ' ' << N::E::E2 << ' ' <<N::E::E3 << std::endl;
return 0;
}
#else
#include <stdio.h>
#include "enum_n_e.h"
int main(void)
{
printf("C: %u %u %u\n", (unsigned int)N_E_E1, (unsigned int)N_E_E2, (unsigned int)N_E_E3);
}
#endif
// DON'T want include guards!
// otherwise including several headers defining enums that way would fail!
#ifdef __cplusplus
#define ENUM_DEFINITION(NAMESPACE, NAME, CONTENT) \
namespace NAMESPACE \
{ \
enum class NAME \
{ \
CONTENT(NAMESPACE, NAME) \
}; \
}
#define ENUM_ENTRY(N, E, V) V
#else
#define ENUM_DEFINITION(NAMESPACE, NAME, CONTENT) \
enum NAMESPACE##_##NAME \
{ \
CONTENT(NAMESPACE, NAME) \
};
#define ENUM_ENTRY(N, E, V) ENUM_ENTRY_(N, E, V)
#define ENUM_ENTRY_(N, E, V) N##_##E##_##V
#endif
#undef ENUM_DEFINITION
#undef ENUM_ENTRY
#ifndef __cplusplus
#undef ENUM_ENTRY_
#endif
#undef ENUM_CALL
#undef ENUM_CALL_
#ifndef ENUM_N_E_H_
#define ENUM_N_E_H_
#include "genEnumDefine.h"
#define ENUM_N_E(NAMESPACE, NAME) \
ENUM_ENTRY(NAMESPACE, NAME, E1 = 1), \
ENUM_ENTRY(NAMESPACE, NAME, E2), \
ENUM_ENTRY(NAMESPACE, NAME, E3)
ENUM_DEFINITION(N, E, ENUM_N_E)
#include "genEnumUndef.h"
#endif