Мне интересно, если есть какие-либо гарантии о постоянном складывания делается в С.Минимальная гарантированная постоянная складывая в C
Где я смотрел
This link на сайте которого респектабельности является неизвестно мне делает оффициальный комментарий:
Все компиляторы C могут складывать целочисленные константные выражения, которые присутствуют после макрорасширения (требование ANSI C).
Но я ничего не вижу, например. Язык программирования C, второй выпуск (который, как я полагаю, был тщательно обновлен для учета всех деталей ANSI C). Но после проверки индекса ссылок на соответствующие слова я ничего не нашел, что обещает это. Страницы 38 и 209, в частности, близки, потому что говорят, что любое выражение, которое может быть оценено во время компиляции, может использоваться там, где может использоваться константа (возможно, с некоторыми ограничениями, если мы достаточно педантичны), и в ней говорится, что такие выражения «may» будут оцениваться во время компиляции, а не «будет»/(некоторый синоним).
Я искал this C89 final draft. Слово «складывание» и «сложение» не дало никаких результатов, а поиск «постоянное выражение» породил 63 совпадения, из которых я проверил примерно половину. Основная часть интереса, по-видимому, в основном такая же, как и книга (она использует слово «может» вместо «может», но в этом контексте они синонимы).
Оба эти логически сильно указывают на то, что каждый компилятор ANSI C должен иметь базовые возможности с постоянной сгибанием, но в то же время, похоже, нет жесткого запрета на компиляцию постоянных выражений в код который вычисляет выражение во время выполнения (такая реализация по-прежнему пользуется постоянными выражениями, поскольку компилятор может генерировать код, который его вычисляет один раз, а затем предполагает, что значение не изменится, и такая реализация может быть вызвана ограничениями в данной базовой архитектуре - например, несколько архитектур RISC должны либо использовать две инструкции для инициализации определенных возможных значений, либо загрузить их из памяти).
Я также коротко искал this C99 final draft, но «складывание» дало один результат без значения, а «сложенный» и «постоянный» имел более ста совпадений, каждый из которых я не мог выделить время для проскальзывания.
Мотивация
Я написал эти макросы для более семантической/Намерения ясности в некотором битом вертеле коде:
#define UCHAR_LOW_N_BITS_m(n) (unsigned char)(UCHAR_MAX >> (CHAR_BIT - (n)))
#define UCHAR_NTH_BIT_m(n) (unsigned char)(1 << (n))
..where n
всегда является целым буквальным. Я хочу успокоиться, чтобы услышать обнадеживающий голос: «Все в порядке, каждый используемый C-компилятор, что отдаленно важно, сбросит эти константы для вас». (P.S. Я задал отдельный вопрос о том, должен ли UCHAR_NTH_BIT_m
действовать, как если бы bits start from the 0th or 1st bit, надеюсь, в нужном месте.)
И да, нижний может быть превращен в отдельные макросы, например.#define UCHAR_1ST_BIT_m (unsigned char)1
через #define UCHAR_3RD_BIT_m (unsigned char)4
или сколько бы мне ни понадобилось в коде - и пока я не знаю, какой из них лучше, это, вероятно, спорный вопрос, потому что, если я хочу быть хорошим педантичным языком-адвокатом типа C программист, я не могу точно избегать верхнего (нужно убедиться, что код правильно подходит для этих реализаций DSP/встроенных и старомодных мейнфреймов C).
Это зависит от разработчика компилятора. «Can» является «американским» для «may» и означает, что вам разрешено, но вам не нужно это делать. И да, любой хороший компилятор сделает это. –
Я не думаю, что использование «can» ограничено американским английским языком. – dreamlax
@ KlasLindbäck: Я ценю разъяснение, но я знал: именно поэтому я сказал «похоже, в основном, то же самое» - потому что я понял, что, хотя есть различие в формулировках, это означало, по сути, одно и то же. Я отредактирую его, чтобы уменьшить вероятность дальнейшего недоразумения. – mtraceur