相关疑难解决方法(0)

如何将static_assert与sizeof和stringify结合起来?

内存使用在我的应用程序中非常重要.因此,我有特定的断言,在编译时检查内存大小,如果大小与我们之前认为正确的大小不同,则给出static_assert.

我已经定义了一个像这样的宏:

#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");
Run Code Online (Sandbox Code Playgroud)

这个宏使得编写它非常容易:

CHECKMEM(Book,144);
CHECKMEM(Library,80);
Run Code Online (Sandbox Code Playgroud)

问题是当这个static_assert出现时,可能很难找出新的大小应该是什么(例如通过使用隐藏的编译器选项"/ d1 reportAllClassLayout").如果我可以包含实际大小会更方便,所以代替:

Book的大小不正确!

它会显示出来

Book的大小不正确!(预计144,大小为152)

我试着写这样的东西:

#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");
Run Code Online (Sandbox Code Playgroud)

但是你不能在函数调用中使用stringize(#)运算符.

我也尝试添加双串联技巧,如下所示:

#define STR1(x) #x 
#define STR2(x) STR1(x) 
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " STR2(sizeof(mytype)) ")");
Run Code Online (Sandbox Code Playgroud)

但不是打印size is 152它打印size is sizeof(Book) …

c++ static-assert visual-studio-2010 stringify c++11

17
推荐指数
2
解决办法
8153
查看次数