В настоящее время я очищаю существующую C-библиотеку, чтобы опубликовать ее без зазрения совести.
Макрос препроцессора NPOT
используется для вычисления следующей большей степени двойки для данного выражения интегральной константы во время компиляции . Макрос обычно используется при прямой инициализации. Для всех других случаев (например, с использованием переменных параметров) существует встроенная функция с той же функцией.
Но если пользователь передает переменную, алгоритм расширяется до огромного фрагмента машинного кода. У меня вопрос: Что я могу сделать, чтобы запретить пользователю передавать в мой макрос что-либо, кроме интегрального константного выражения?
#define NPOT(x) complex_algorithm(x)
const int c=10;
int main(void) {
int i=5;
foo = NPOT(5); // works, and does everything it should
foo = NPOT(c); // works also, but blows up the code extremely
foo = NPOT(i); // blows up the code also
}
Что я уже пробовал:
#define NPOT (x) complex_algorithm (x) ## u)
. Он по-прежнему работает и выдает ошибку компилятора для переменных параметров - даже если это вряд ли полезно. Если не будет такой переменной, как iu ... Грязно, опасно, не хочу.