我在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
为(2 31 ) - 1现在的问题是
错误没有执行我之前从未使用过#if
宏,我需要让它工作......
任何帮助都将不胜感激。
答案 0 :(得分:3)
您不能将预处理器用于变量。预处理器是一个单独的步骤,在编译之前运行,它不知道源中使用的变量,尤其是它们的运行时值。
为此,您可能需要使用assert
:
assert(_SIZE <= 0x7fffffff);
如果将负值传递给期望无符号值的函数,则应该收到编译器警告,如果没有,则应该启用更多警告。
答案 1 :(得分:0)
#error
是预处理程序指令。因此,它在编译期间由预处理器执行。它无法检查作为_SIZE
参数传递的值,因为该值仅在您的程序执行时才知道。
使用其他方法在运行时发出错误信号,例如:异常。