Можно ли динамически создавать эквивалент макроса limit.h во время компиляции? - PullRequest
0 голосов
/ 09 марта 2012

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

Ответы [ 2 ]

1 голос
/ 09 марта 2012

То, о чем ты просишь, невозможно. Как уже говорилось ранее, любая реализация C, соответствующая стандартам, будет правильно определена как limits.h. Если это неверно по какой-либо причине, виноват поставщик компилятора. Любое «динамическое» обнаружение истинных пределов было бы невозможно во время компиляции, особенно если вы выполняете кросс-компиляцию для встроенной системы, и, следовательно, целевая архитектура может иметь меньшие целые числа, чем система компиляции.

Чтобы динамически определять пределы, вам придется делать это во время выполнения, сдвигая, умножая или добавляя биты, пока не встретится переполнение, но тогда у вас есть переменная в памяти, а не константа, что было бы значительно помедленнее. (В любом случае это было бы ненадежно, поскольку в разных архитектурах используются разные представления на уровне битов, а арифметика иногда выходит за пределы ограничений, особенно при представлении чисел со знаком и абстрактных чисел, таких как числа с плавающей запятой) *

Просто используйте стандартные типы и ограничения, как указано в stdint.h и limits.h, или старайтесь не сдвигать пределы все вместе.

1 голос
/ 09 марта 2012

Первое, что приходит мне в голову: вы рассматривали возможность использования stdint.h?Благодаря этому ваша библиотека будет переносимой на C99-совместимые компиляторы.

...