У меня есть функция, которая принимает значение длины, которое не должно превышать 32 768. Я хочу проверить это условие во время компиляции, потому что во встроенной системе нет хорошего способа справиться с этой ошибкой. Кроме того, передаваемое значение длины всегда должно быть постоянной времени компиляции, обычно sizeof()
.
Возможно ли это в C99 или с расширениями GCC / Clang?
Что-то вроде этого, которое, очевидно, делает не компилируется, поскольку len
не является интегральной константой.
#include <assert.h>
void fucntion(const uint16_t len)
{
_Static_assert(len <= 32768, "length parameter too large");
}
Очевидно, что len
const здесь не даст желаемого эффекта, а _Static_assert
жалуется, что len не является интегральной константой.
Я рассмотрел использование макроса для замены func()
, а затем вызвал его, но это имеет два существенных недостатка. Определения макросов не поддерживают такие вещи, как типы или возвращаемые значения, т. Е. Вы не можете сделать
#define bool func(uint16_t len, const void *buffer)
Как указывает Нейт Элдридж, существует расширение G CC (и Clang) это позволяет вам возвращать параметр.