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

На тебе патентованный Волшебный Дефайн а:
Да, если кому интересно, за что я так люблю дефайны, я функционально программировать учился на языке Рефал-5 (если не Рефал-2). А до того еще был Thue, который есть просто недетерминированный вариант нормальных алгорифмов Маркова.
#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, который есть просто недетерминированный вариант нормальных алгорифмов Маркова.



Thue, который есть просто недетерминированный вариант нормальных алгорифмов Маркова.
Прикольно, а как реализована недетерминированность?
Случайным образом выбирается правило замены, для которого в строке можно найти левую часть (и вхождение левой части тоже, по-моему, выбирается случайно).
У Маркова выбирается первое возможное сверху.
У Маркова выбирается первое возможное сверху.
я так люблю дефайныПлатонически (то есть любишь, но не пользуешься)?
С чего бы?
А с того, что скобки забыл
какие-такие скобки?
он забыл int перед array[6]
он забыл int перед array[6]
Вокруг аргументов макросов. Хинт: из ITERATE(1 << 2) получится 4, 8, а не 4, 5
слуш, сначала запусти вышеуказанный код 
экстеоретик
там же плюсы одни...

экстеоретик

там же плюсы одни...
Вышеуказанный - это тот, что в моем посте? Запустил, получается 4, 8. Там вообще-то кроме сложения еще << стоит, а 1 << 2 + 1 дает 8.
Ну тут возможны два решения проблемы:
а) поставить скобки в макросе;
б) не использовать ITERATE с такими слабыми операторами.
Поскольку я не планировал пользоваться сдвигами при написании, соответственно, проблема не возникла, и решения ее не требовались...
а) поставить скобки в макросе;
б) не использовать ITERATE с такими слабыми операторами.
Поскольку я не планировал пользоваться сдвигами при написании, соответственно, проблема не возникла, и решения ее не требовались...
я про этот конкретно:
как я понял, ты про другой... забираю слова назад.
а вообще я безусловно согласен что дефайны злы, и скобки надо ставить
#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)};
как я понял, ты про другой... забираю слова назад.
а вообще я безусловно согласен что дефайны злы, и скобки надо ставить
он забыл int перед array[6]может там C
Оставить комментарий
ivan84
Подскажите пожалуйста, возможно ли с помощью директивы #define объявить массив констант?Если да, то приведите текст того как это должно выглядеть на примере массива:
array[6] = {1,2,3,4,5,6};
Заранее спасибо.