static_assert(如果声明了类型)

static_assert if a type is declared

本文关键字:类型 声明 如果 assert static      更新时间:2023-10-16

在c++11中,如果声明了类型,是否可能导致static_assert失败。我所说的已声明,是指前瞻性声明还是完全定义。

其目的是,如果某个东西已经声明或尚未声明,则会显示一条指导性消息,使编译失败。

除了一个巧妙的技巧外,我完全希望会涉及一些中间的type_traits-like模板,这还不是标准的一部分。

如果一个类型在代码中的某个给定点不存在,那么您就不能在那里引用它。为了引用它,你必须声明它。但你不知道它的任何用法指的是哪个声明。有效断言它不存在的唯一可能性是以与早期声明相冲突的方式声明或定义它,例如:

struct Type;    // Earlier declaration.
// Whatever, then:
using Type = struct Unique_temporary_name*;    // "Type" must not exist.

您可以静态地断言它的大小是您所期望的。

typedef struct _ListNode {
    struct _ListNode* next;
    int value;
} ListNode;
static_assert(sizeof(ListNode) >= sizeof(void*) + sizeof(int));

如果类型存在,它将与任何其他static_assert(…)一样工作,如果不是更好的话,因为这也会检查类型的大小。(如果你不想这样,你可以简单地static_assert(sizeof(ListNode) >= 1)。如果类型不存在,你会得到一个常规错误,而不是断言失败,但我认为这是无法避免的。


Nit:由于编译器添加了填充字节,所以需要>=,除非要包含#pragma pack(1)