2

我正在 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宏,我需要让它工作......

任何帮助,将不胜感激。

4

2 回答 2

3

您不能将预处理器用于变量。预处理器是在编译之前运行的一个单独步骤,它不知道源中使用的变量,尤其是它们的运行时值。

为此,您可能需要使用assert

assert(_SIZE <= 0x7fffffff);

如果您将负值传递给期望无符号值的函数,那么您应该得到编译器警告,如果没有,那么您应该启用更多警告。

于 2013-05-15T06:45:11.860 回答
0

#error是一个预处理器指令。因此,它在编译期间由预处理器执行。它无法检查作为_SIZE参数传递的值,因为该值仅在执行程序时才知道。

在运行时使用其他方法来发出错误信号,例如异常。

于 2013-05-15T06:46:47.637 回答