Цитата(jcxz @ Apr 7 2018, 17:10)
Для вычисления константных выражений (видимо их Вы и имели в виду? так как у макроопределений в си нет никаких типов - это просто текстовые подстановки) компилятор использует определённый тип данных, например unsigned long long для целых. И за его пределы он не может выйти естественно никак по определению.
Пусть называются константные выражения.
Выйти - отчего же не может? Задам ему 1E12 * 1E12, вот и вышел. Переполнился. Мне нужно знать, что вычисление не переполнилось при обработке препроцессором.
Допустим, как определять, есть идеи. Но как эту проверку встроить в макрофункцию?
#define Delay(V, U) delay(V * U * F / 4 / 10E9)
Здесь можно проверить:
V * U <= 2^32 * 4 * 10E9 / F
P.S. тут я смешиваю два вопроса, проверить, что результат укладывается в целое число, и не допустить, чтобы в процессе вычисления не было переполнения длинного числа.
А есть способ выдать число в Build Output компилятора?
Видимо, вопрос сводится к следующему: Как вставить assert внутрь macro?