Как сделать чтобы #ifdef принимал ограннич. кол-во идент.?
От: Иван Романюк  
Дата: 25.12.06 12:37
Оценка:
Речь вот о чем: у меня в программе есть участки кода такого вида:
#ifdef IDENT1
....
#endif
#ifdef IDENT2
...
#endif


Таких участков сравнительно много, проблема в том, что если я где-то ошибусь и напишу вместо, скажем, IDENT2 IEDNT2 — то не скомпилируется кусок кода, но сразу это может быть незаметно — просто какая-то функция в программе не будет работать. Вопрос: можно ли определить такой макрос, скажем, #SafeIfDef (A), который будет проверять принадлежит ли A заданному множеству (в моем случае IDENT1 и IDENT2) или нет, и если нет — генерировать ошибку.
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
Re: Как сделать чтобы #ifdef принимал ограннич. кол-во идент
От: Vain Россия google.ru
Дата: 25.12.06 13:47
Оценка:
Здравствуйте, Иван Романюк, Вы писали:

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

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


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

Можно вынесни #ifdef x и #endif в отдельный инклуд:
//CodeScripts/@IfDefIDENT1.hpp
//no #pragma once and ifdef guards
#ifdef IDENT1

//CodeScripts/@IfDefIDENT2.hpp
//no #pragma once and ifdef guards
#ifdef IDENT2

//CodeScripts/@EndIf.hpp
//no #pragma once and ifdef guards
#endif

//Main.cpp
#include "CodeScripts/@IfDefIDENT1.hpp"
//long blablabla
#include "CodeScripts/@EndIf.hpp"

#include "CodeScripts/@IfDefIDENT2.hpp"
//long blablabla again :)
#include "CodeScripts/@EndIf.hpp"
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Как сделать чтобы #ifdef принимал ограннич. кол-во идент
От: superlexx  
Дата: 25.12.06 15:31
Оценка: 3 (1)
можно так: (AFAIK MSVC only и если есть возможность править код)

#pragma warning (1:4668; error:4668)


тогда:
#define CORRECT_DEF 1
#define SIMPLE_DEF
#if TYPO_DEF != 0 /* fails: error C4668: 'MYDEF' is not defined as a preprocessor macro */
#if SIMPLE_DEF != 0 /* fails: fatal error C1017: invalid integer constant expression */
#if CORRECT_DEF != 0 /* OK */
#if CORRECT_DEF == 0 /* OK */


то есть придётся отказаться от простых define, ifdef и ifndef, а также надо будет вместо #undef MYDEF так делать: #define MYDEF 0
Re[2]: Как сделать чтобы #ifdef принимал ограннич. кол-во ид
От: TNikolay Россия http://softvoile.com/
Дата: 25.12.06 20:49
Оценка:
Здравствуйте, superlexx, Вы писали:

А еще можно использовать, извиняюсь что рекламирую себя, как это делаю я Flashpaste что бы _гарантированно_ вставлять такие веши без ошибок.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Блог шароварщика ::Микроблог про wxWidgets
Re[2]: Как сделать чтобы #ifdef принимал ограннич. кол-во ид
От: Vain Россия google.ru
Дата: 25.12.06 23:51
Оценка:
Здравствуйте, Vain, Вы писали:

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

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


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

Вот это работает под msvc:
#include <stdio.h>

#define _E1(x) x
#define PLATFORM_WIN32_UNDER_CE /_E1(*"*/defined(WIN32) && defined(UNDER_CE)/*"*)/
#define UNDER_CE

int main() {
#if PLATFORM_WIN32_UNDER_CE
  printf("%d\n",1);
#endif
#undef UNDER_CE
#if PLATFORM_WIN32_UNDER_CE
  printf("%d\n",2);
#endif
  return 0;
}
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.