LINUX.ORG.RU

инициализация статических переменных — генерация последовательностей


0

0

Есть необходимость пронумеровать все исключительные ситуации (ошибки) в C-программе (константы). Чтоб вот для такой-то версии такой-то номер ошибки -- и сразу можно сказать что именно это есть.

Самый простой вариант: пронумеровать как есть. Опасен возможностью дублирования номеров. Неприемлемо.

Использование макропроцессора: каждой ситуации присваивается символическое имя. Дубли ищутся grep'ом. Это плохое решение, но это решение. А список большой получается, что неудобно.

Хотелось бы автоматической нумерации и автоматического же выявления дублей. Хотелось бы из исходника извлекать, при необходимости, список этих номеров с расшифровкой каждого. Именно из исходника, потому как поддерживать его отдельно -- ну понятно...

Я понимаю, что m4 решает любые задачи программирования... Но не хотелось бы с ним связыватся. Хотелось бы остаться в рамках стандартного C-препроцессора. Который, я не вижу как его здесь можно применить. Я вижу, что его принципиально невозможно применить для того, для чего я хочу. Но может просто я не вижу какого-то достаточно простого решения?


что-то подобное было сделано в watcom (ныне OpenWatcom) для аналогичных целей. деталей не помню а смотреть, пардон, лениво и нет времени.

// wbr

klalafuda ★☆☆
()

может можно использовать gperf ? но тогда всё равно надо будет создавать отдельный файл со списком ошибок (можно с дубликатами). gperf будет запускаться во время make.

buddha
()
Ответ на: комментарий от Begemoth

enum не может АВТОМАТИЧЕСКИ сгенерить например последоваетельность квадратов

типа так:

enum{
  x2_2=2*2;
  x2_3=2*2*2;
  x2_4=2*2*2*2;
  x2_5=2*2*2*2*2;
//...
}

в С это можно сотворить только макропроцессором и то отличным от CPP.

cvv ★★★★★
()

а может вот так

typedef enum{exception_1=1, exception_2, exception_3, exception_4, exception_5} exception_states_t;

constants_t constants[]={ [exception_1]=constant_1, [exception_2]=constant_2, [exception_3]=constant_3, [exception_4]=constant_4, [exception_5]=constant_5 }

cvv ★★★★★
()
Ответ на: комментарий от cvv

а зачем это нужно для "пронумеровать все исключительные ситуации (ошибки) в C-программе (константы)"? Чем плоха последовательная нумерация?

Begemoth ★★★★★
()
Ответ на: комментарий от cvv

>>Чем плоха последовательная нумерация?

> а я какую собственно предложил?

Последовательная нумерация, как в примере с enum, плоха тем, что два раза подряд можно вписать одну константу. Вписывается ведь ручками. Идеально было бы иметь макрос-генератор последовательности чисел. Ключевое слово -- РАЗНЫХ.

fk0
() автор топика
Ответ на: комментарий от fk0

>Идеально было бы иметь макрос-генератор последовательности чисел. Ключевое слово -- РАЗНЫХ.

хм.

ну а чем в таком случае тебя просто массив констант не устроил?

типа

const char** const const_arr={"const_0","const_1","const_2","con st_3"};

?

гарантия того что каждой константе будет соответствовать уникальный индекс - 100%.

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.