如果声明了类型,则为静态声明

问题描述 投票:2回答:2

在c ++ 11中,如果声明了类型,可能导致static_assert失败。所谓宣告,是指向前宣告还是已完全定义。

目的是如果已声明或尚未声明某些内容,则编译失败并显示指示性消息。

除了一个聪明的窍门,我完全希望其中涉及一些尚未成为标准一部分的类似type_traits的中间模板。

c++ c++11
2个回答
1
投票

如果代码中给定的点不存在某种类型,则不能在那里引用它。为了引用它,您必须声明它。但是,您不知道对它的任何引用都指向哪个声明。有效断言它不存在的唯一可能性是,然后以与早期声明冲突的方式声明或定义它,例如像这样:

struct Type;    // Earlier declaration.

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

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)。
© www.soinside.com 2019 - 2024. All rights reserved.