Как проверить, является ли параметр интегральным константным выражением в макросе препроцессора C?

В настоящее время я очищаю существующую 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
}

Что я уже пробовал:

  1. Определите макрос как #define NPOT (x) complex_algorithm (x) ## u) . Он по-прежнему работает и выдает ошибку компилятора для переменных параметров - даже если это вряд ли полезно. Если не будет такой переменной, как iu ... Грязно, опасно, не хочу.
  2. Документация не работала для большинства пользователей.
6
задан Brian Tompsett - 汤莱恩 9 April 2016 в 21:38
поделиться