Я ищу способ #define макроса, который принудительно применяет его аргументы для компиляции констант времени и в то же время может использоваться в выражении. Этот метод должен работать под управлением C90 и быть совместимым с повышением, если возможно, также переносимым для разных вариантов C++. Также предпочтительнее использовать 0-footprint для памяти.Макрос для использования в выражении при применении своих аргументов для компиляции констант времени
В качестве примера рассмотрим макрос минимального времени компиляции. Поведение должно быть:
#define CT_MIN(CTC_A, CTC B) <<<MAGIC>>>
int a = 1;
int b = a + CT_MIN(1,4); /* OK */
int c = a + CT_MIN(a,4); /* COMPILER DIAGNOSTIC */
Чтобы спровоцировать декомпилировать диагностики, в общем, я мог бы эмулировать с статических проверок что-то вроде:
typedef char ct_check_is_ct_constant[(CTC_A != 0) + 1];
, который не компилируется (или поднимет некоторые диагностические по крайней мере,), если для CTC_A используется что-либо, кроме постоянной времени (времени) компиляции; но если CTC_A является числом, он всегда будет успешным (с некоторой осторожностью с областями). Но это утверждение будет работать только в макрокоманде с несколькими утверждениями и поэтому не может быть использовано как часть выражения.
Я предположил бы, что-то в строках:
#define CT_MIN(CTC_A, CTC_B) \
(<expr check CTC_A>, \
<expr check CTC_B>, \
(CTC_A) < (CTC_B))? (CTC_A) : (CTC_B) \
)
Но я понятия не имею, как выражения должны выглядеть, и если такая вещь существует.
Любые идеи?
фона:
У меня есть огромное количество констант из не слишком много надежных источников через costumized заголовка. Эти константы сильно параметризуют мой код. Я хочу реализовать проверку нулевого следа во время препроцессора и время компиляции для этих констант, чтобы проверить как мои предположения, среду, так и мои навыки, чтобы написать правильный генератор кода.
Берегись типами VLA. Я думаю, вы могли бы определить тип структуры с битовым полем, размер которого определен в терминах аргумента макроса, хотя я бы не стал доверять себе, чтобы знать обо всех предостережениях и получить его полностью прав. – user2357112
@ user2357112 :-) Я не совсем уверен, как типы VLA могут использоваться для достижения макроса MIN, который не будет работать во время компиляции, если его аргументы не являются константами времени компиляции. –
Я говорю, чтобы убедиться, что вы случайно не объявляете тип VLA, думая, что длины массива всегда являются константой времени компиляции. – user2357112