Массив констант и директива #define.

ivan84

Подскажите пожалуйста, возможно ли с помощью директивы #define объявить массив констант?
Если да, то приведите текст того как это должно выглядеть на примере массива:
array[6] = {1,2,3,4,5,6};
Заранее спасибо.

Andbar

#define - это не константы, а подстановка чего-то вместо заданного идентификатора на стадии препроцессинга. А это значит, что компилятор вместо идентификатора будет видеть то, что ты задашь. На сколько я знаю, в С массивы, как и прочие сложные структуры, можно инициализировать целиком только в объявлении, так что пользы от #define'а в этом случае не будет.
В любом случае, правильнее объявить константную переменную (const int array[6] = {...}). Для величин тоже #define-ы не использовать. Либо const, либо, если не хочется эту константу хранить в одном месте, то для ordinal-типов можно использовать enum'ы (enum {myval=65535};). Большой плюс этих решений перед #define'ами в том, что они обрабатываются компилятором, а не препроцессором, соответственно для них работают области видимости.

vall

ещё один укурок =)

apl13

Но-но-но-но! :mad:

apl13

На тебе патентованный Волшебный Дефайн а:
#define ITERATE(x) x, x + 1
#define FOUR(x) ITERATE(x ITERATE(x+2)
#define EIGHT(x) FOUR(x FOUR(x+4)

array[6] = {FOUR(1 ITERATE(5)};

Да, если кому интересно, за что я так люблю дефайны, я функционально программировать учился на языке Рефал-5 (если не Рефал-2). А до того еще был Thue, который есть просто недетерминированный вариант нормальных алгорифмов Маркова. :crazy:

vall

:smirk:

apl13

:p

asvsergey

Thue, который есть просто недетерминированный вариант нормальных алгорифмов Маркова.

Прикольно, а как реализована недетерминированность?

apl13

Случайным образом выбирается правило замены, для которого в строке можно найти левую часть (и вхождение левой части тоже, по-моему, выбирается случайно).
У Маркова выбирается первое возможное сверху.

tamusyav

я так люблю дефайны
Платонически (то есть любишь, но не пользуешься)?

apl13

С чего бы?

tamusyav

А с того, что скобки забыл

margadon

какие-такие скобки? :)
он забыл int перед array[6]

tamusyav

Вокруг аргументов макросов. Хинт: из ITERATE(1 << 2) получится 4, 8, а не 4, 5

margadon

слуш, сначала запусти вышеуказанный код :)
экстеоретик :)
там же плюсы одни...

tamusyav

Вышеуказанный - это тот, что в моем посте? Запустил, получается 4, 8. Там вообще-то кроме сложения еще << стоит, а 1 << 2 + 1 дает 8.

apl13

Ну тут возможны два решения проблемы:
а) поставить скобки в макросе;
б) не использовать ITERATE с такими слабыми операторами.
Поскольку я не планировал пользоваться сдвигами при написании, соответственно, проблема не возникла, и решения ее не требовались...

margadon

я про этот конкретно:

#define ITERATE(x) x, x + 1
#define FOUR(x) ITERATE(x ITERATE(x+2)
#define EIGHT(x) FOUR(x FOUR(x+4)

array[6] = {FOUR(1 ITERATE(5)};

как я понял, ты про другой... забираю слова назад.
а вообще я безусловно согласен что дефайны злы, и скобки надо ставить

Andbar

он забыл int перед array[6]
может там C
Оставить комментарий
Имя или ник:
Комментарий: