Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зафиксировать enum. 
:(
    Опции темы
semibug
Дата 12.10.2011, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



В продолжение темы, какими инструментами лучше воспользоваться для предварительного анализа кода?
К примеру поставив такую задачу выполняться перед сборкой, можно застраховаться от некоторых проблем.
В этом конкретном случае проверка должна заключаться в поиске знака "=" в пределах блока, обозначенного фигурными скобками, предваренного заданным идентификатором (именем перечисления), в указанном файле.
Сразу на ум приходят регулярные выражения.
Наверняка есть какие либо готовые системы такой статической проверки исходного кода?



PM   Вверх
mes
Дата 12.10.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



semibug, я так понимаю Вы примеры не смотрели.. 
вот вам упрощенная вырезка для допиливания под нужды :

Код

struct Enum 
{
   static unsigned current;
   static unsigned last;
   
   unsigned value;
   
   operator unsigned () const { return value; } 
   
   Enum () : value ( current++ ) {  if (current > last) throw; } 
   
};

unsigned Enum::current  = 0;
unsigned Enum::last     = 100;

Enum a,b,c,d,e,f,g; 


int main ()
{

     for (auto i : { a,b,c,d,e,f,g } )
       std::cout << i << " ";
}

http://liveworkspace.org/code/0aa33cd6c94f...dc91a54e75a689b

преимущество в том что енум можно "доопредялять", но хочу предупредить что подход с автоматической енумерацией подходит лишь когда команды не покидают пределов приложения.. для взаимосвязи двух приложений лучше не надеетья на автоматическое перечисление..




--------------------
PM MAIL WWW   Вверх
semibug
Дата 12.10.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



mes, не только смотрел, но и пробовал использовать, благодарю за помощь.
К сожалению ни вариант с фабрикой, ни с генерацией по XML не одобрил руководитель проекта, с мотивацией "излишние сущности", т.е. в нашем случае остались классические перечисления enum, с явным комментарием, как и предлагал bsa.
PM   Вверх
math64
Дата 12.10.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно с помощью макросов - но, возможно, тоже скажут "излишние сущности", но иногда полезно
Код

#include <stdio.h>
#define ENUM \
 E(a, =10, "this is 'a'") D \
 E(b, , "this is 'b'") D \
 E(c, =10, "this is 'c'")
#define E(e,v,c) e v
#define D ,
enum Enum {
  ENUM
};
#undef E
#undef D
#define E(e,v,c) case e: return c;
#define D
const char* comment(enum Enum e) {
  switch(e) {
    ENUM
  }
}
#undef E
#undef D
#define E(e,v,c) e
#define D ,
static enum Enum enums[] = {
  ENUM
};
const int cnt = sizeof(enums)/sizeof(enums[0]);
int main() {
  int i;
  for(i = 0; i < cnt; i++)
    printf("%d: %s\n", enums[i], comment(enums[i]));
}

Сообщения компилятора:
Код

test.c: In function `comment':
test.c:17: error: duplicate case value
test.c:17: error: previously used here

(к сожалению, компилятор не выдаёт в сообщении об ощибке повторяющееся значение - строка одна и та же, поскольку используется макрос.
Вывод программы после исправления ошибки:
Код

10: this is 'a'
11: this is 'b'
12: this is 'c'

PM   Вверх
math64
Дата 19.10.2011, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Тоже самое можно сделать без #undef:
Код

#include <stdio.h>

#define NAME(e,v,c) e
#define NAME_VALUE(e,v,c) e v
#define CASE(e,v,c) case e: return c;
#define COMMA ,
#define EMPTY

#define ENUM(E,D) \
 E(a, =10, "this is 'a'") D \
 E(b, , "this is 'b'") D \
 E(c, =10, "this is 'c'")

enum Enum {
  ENUM(NAME_VALUE,COMMA)
};

const char* comment(enum Enum e) {
  switch(e) {
    ENUM(CASE,EMPTY)
  }
}

static enum Enum enums[] = {
  ENUM(NAME,COMMA)
};
const int cnt = sizeof(enums)/sizeof(enums[0]);

int main() {
  int i;
  for(i = 0; i < cnt; i++)
    printf("%d: %s\n", enums[i], comment(enums[i]));
}

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.