В своих проектах беру себе за правило чтобы, если имеются какие-то дефайны, задающие некоторые условия компиляции, то где-то была проверка на допустимость значений этих дефайнов и, если они вне допустимых пределов, проект не собирался бы. Например: имеется некий дефайн, задающий кол-во элементов массива N (размер элемента L), этот массив передаётся через некий интерфейс, размер кадра которого ограничен некоей величиной M. В этом случае я добавляю проверку, чтобы: N*L <= M. Если все величины известны на этапе препроцессора, всё ок - делаю: #if/#error/#endif Но если контролируемое выражение нельзя рассчитать на этапе препроцессора (например: L=sizeof(...)), то приходится писать что-то вроде: enum {CheckExp = 1 / ((N*L > M) ? 0: 1)}; в расчёте на ошибку "деление на ноль" при компиляции. Работает конечно, но может есть более элегантное решение?
|