c++ - 如何使用 #error 指令 - C++

标签 c++ macros c-preprocessor compiler-directives

我正在 C++ 中创建一个自初始化数组类,我想知道如果用户尝试分配超过 0x7fffffff 我会如何抛出错误而不是异常。字节。

类似于<array>其中:

error C2148: total size of array must not exceed 0x7fffffff bytes

这是我正在测试的一个构造函数的代码:

    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)-10x7fffffff是 (231)-1 现在的问题是 错误没有执行我从未使用过 #if之前的宏,我需要让它工作......

如有任何帮助,我们将不胜感激。

最佳答案

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

为此,您可能需要使用 assert :

assert(_SIZE <= 0x7fffffff);

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

关于c++ - 如何使用 #error 指令 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16558420/

相关文章:

clojure - 线程优先、线程最后和 "dot"形式

c++ - const 限定符 函数结束

c++ - Main.exe 中的 0x6FDFDBF0 (vcruntime140.dll) 抛出异常

c++ - 将 wxMouseEvent 传播到 wxWidget 中的基类

使用父宏的右括号的 C 预处理器

java - Ant:路径中的可变部分作为宏的属性

c - MSVC : Error mapping a structure to an array of offsetof

assembly - 如何在GNU ARM汇编程序中为寄存器赋予其他名称?

C++ 递归类型特征

c++ - 调用另一个 : MSVC issue? 的预处理器宏