Я создаю класс самоинициализирующихся массивов в 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
макрос, и мне нужно, чтобы это работало …
Любая помощь будет оценена.
Вы не можете использовать препроцессор для переменных. Препроцессор — это отдельный шаг, который выполняется до компиляции, и он не имеет представления о переменных, используемых в источнике, и особенно их значениях времени выполнения.
Для этого вы можете использовать assert
:
assert(_SIZE <= 0x7fffffff);
Если вы передаете отрицательное значение в функцию, ожидающую неподписанные значения, вы должны получить предупреждение компилятора, а если нет, то вы должны включить больше предупреждений.
#error
это директива препроцессора. Как таковой, он выполняется препроцессором во время компиляции. Он не может проверить, какое значение передается как _SIZE
параметр, потому что это значение известно только тогда, когда ваша программа выполняется.
Используйте другие средства для сигнализации об ошибках во время выполнения, например, исключения.