如果声明了类型,则为static_assert

时间:2015-12-09 03:03:34

标签: c++ c++11

在c ++ 11中,如果声明了类型,可能会导致static_assert失败。并且声明我指的是前向声明还是完全定义。

目的是如果已经或者尚未声明某些内容,则使用指导性消息使编译失败。

除了一个聪明的技巧,我完全希望涉及一些类似于类似中间类型的模板,这不是标准的一部分。

2 个答案:

答案 0 :(得分:1)

如果代码中的给定点不存在某种类型,那么您就无法在那里引用它。为了引用它,你必须声明它。但是,你无法知道它对它的任何使用所引用的声明。有效断言它不存在的唯一可能性是以与先前声明冲突的方式声明或定义它,例如,像这样:

struct Type;    // Earlier declaration.

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

答案 1 :(得分:0)

您可以静态断言其大小就是您所期望的。

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)。