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

Posted

技术标签:

【中文标题】如何使用 #error 指令 - C++【英文标题】:How to use the #error directive - C++ 【发布时间】:2013-05-15 06:41:11 【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

我认为 memset 行应该是这样的:memset(_content, 0, (sizeof(T) * _SIZE)); 不要使用带有双下划线或以下划线后跟大写字母的标识符。这些是为实现保留的(除了看起来很丑),即使在编译之前使用。 @user1764961 或sizeof(*_content)。但是T不是原始类型,那么memset根本不应该使用,因为它会对对象数据造成不良影响,如果类具有虚函数,包括虚表。 顺便说一句,你的班级与例如std::vector? constructing a std::vector 时可以同时设置大小和初始数据。 【参考方案1】:

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

为此,您可能需要使用assert

assert(_SIZE <= 0x7fffffff);

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何使用 #error 指令 - C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在 makefile 指令中同时包含 C 和 C++ 文件

C++中怎样写宏定义

如何使用 SSE 指令?

如何使用“asm volatile”编写 btr 指令

如何在 C++ 中使用类函数?

如何手动编译使用 C++ 的 Cython 代码?