макросы — Как использовать директиву #error

Я создаю класс самоинициализирующихся массивов в C ++, и мне интересно, как бы я выдавал ошибку, а не исключение, если бы пользователь попытался выделить больше 0x7fffffff байт.

Похожий на <array> где:

ошибка C2148: общий размер массива не должен превышать 0x7fffffff байтов

Это мой код для одного из моих конструкторов, где я тестирую это:

    template<typename T>
Array<T>::Array(const size_t _SIZE) : _SIZE(_SIZE), _content(nullptr){
#define __SIZE__ _SIZE
#if (__SIZE__ > 0x7fffffff)
#error Total size of Array must not exceed 0x7fffffff bytes.
#endif
_content = new T[_SIZE];
memset(_content, 0, (sizeof(_content) * _SIZE));
}

Способ создания массива приведен ниже:

Array<int> foo(-1) //-1 of size_t = ((2^31)*2)-1 error should be shown since ((2^31)*2)-1 > ((2^31)*2)-1

size_tмаксимальный размер ((2^31)*2)-1 а также 0x7fffffff есть (231) -1 теперь проблема в том
ошибка не выполняется, я никогда не использовал #if макрос, и мне нужно, чтобы это работало …

Любая помощь будет оценена.

2

Решение

Вы не можете использовать препроцессор для переменных. Препроцессор — это отдельный шаг, который выполняется до компиляции, и он не имеет представления о переменных, используемых в источнике, и особенно их значениях времени выполнения.

Для этого вы можете использовать assert:

assert(_SIZE <= 0x7fffffff);

Если вы передаете отрицательное значение в функцию, ожидающую неподписанные значения, вы должны получить предупреждение компилятора, а если нет, то вы должны включить больше предупреждений.

3

Другие решения

#error это директива препроцессора. Как таковой, он выполняется препроцессором во время компиляции. Он не может проверить, какое значение передается как _SIZE параметр, потому что это значение известно только тогда, когда ваша программа выполняется.

Используйте другие средства для сигнализации об ошибках во время выполнения, например, исключения.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector