当前的运行时实现如下:
#define ASSERT_LAST_Member(Class, Member) {Class foo; assert(((size_t)(&foo) + sizeof(foo)) == ((size_t)(&foo.Member) + sizeof(foo.Member)));}
编译时如何进行静态断言?我试过这样做,但它没有用。
#define assert_static(e) \
do { \
enum { assert_static__ = 1/(e) }; \
} while (0)
#define ASSERT_LAST_Member(Class, Member) { assert_static(((size_t)&((Class*)0)->Member)+sizeof(((Class*)0)->Member)==sizeof(Class)) }
答案 0 :(得分:1)
你无法断言一个成员是今天最后一个成员。一旦接受并实施,回复N3814的提案可能会使这成为可能,但它们今天无法使用。根据当前可用的内容,由于填充问题,您仍然沉没(请参阅评论中的Csq&#39示例)。
如果你忽略了填充的限制,并将自己局限于"普通旧数据"在没有虚拟继承的情况下,您可以使用offsetof
macro或How to calculate offset of a class member at compile time?中的建议来执行您想要的检查。
但实际上,根据你对所有类的协议类的评论,你不能只针对已知的类大小做一个断言吗?当成员被重新排序时,或者在填充中添加适合的情况时,它不会捕获案例。但静态断言实际上只是为了防止意外的错误更改,并且您声称不使用填充。所以说简单:
static_assert(sizeof(Foo) == 12, "Size of Foo has changed");