Re: Как сделать чтобы #ifdef принимал ограннич. кол-во идент
От: remark Россия http://www.1024cores.net/
Дата: 25.12.06 13:06
Оценка:
Здравствуйте, Иван Романюк, Вы писали:

ИР>Речь вот о чем: у меня в программе есть участки кода такого вида:

ИР>#ifdef IDENT1
ИР>....
ИР>#endif
ИР>#ifdef IDENT2
ИР>...
ИР>#endif


ИР>Таких участков сравнительно много, проблема в том, что если я где-то ошибусь и напишу вместо, скажем, IDENT2 IEDNT2 — то не скомпилируется кусок кода, но сразу это может быть незаметно — просто какая-то функция в программе не будет работать. Вопрос: можно ли определить такой макрос, скажем, #SafeIfDef (A), который будет проверять принадлежит ли A заданному множеству (в моем случае IDENT1 и IDENT2) или нет, и если нет — генерировать ошибку.


Можно, например, вот так:

#ifdef IDENT1
#define PLATFORM_DEPENDENT(a, b) a
#endif
#ifdef IDENT2
#define PLATFORM_DEPENDENT(a, b) b
#endif

if (some_func() == PLATFORM_DEPENDENT(14, 47))
...


Или так:


#if defined(IDENT1)
...
#elif  defined(IDENT2)
...
#else
BOOST_STATIC_ASSERT(false);
#endif




Или так:


#ifdef IDENT1
#define PLATFORM 1
#endif
#ifdef IDENT2
#define PLATFORM 2
#endif
#ifdef IDENT3
#define PLATFORM 3
#endif

template<int id> struct platform_dependent;

template<> struct platform_dependent<1>
{
  static void f1() {...}
  static void f2() {...}
};

template<> struct platform_dependent<2>
{
  static void f1() {...}
  static void f2() {...}
};

template<> struct platform_dependent<3>
{
  static void f1() {...}
  static void f2() {...}
};

typedef platform_dependent<PLATFORM> platform;

int main()
{
  platform::f1();
  platform::f2();
}




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.