内存使用在我的应用程序中非常关键。因此,我有特定的断言,在编译时检查内存大小,如果大小与我们之前认为正确的大小不同,则给出一个 static_assert 。
我已经定义了一个这样的宏:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");
这个宏使得写这个很容易:
CHECKMEM(Book,144);
CHECKMEM(Library,80);
问题是,当这个 static_assert 关闭时,可能很难找出新的大小应该是多少(例如,通过使用隐藏的编译器选项“/d1 reportAllClassLayout”)。如果我可以包括实际尺寸会更方便,所以而不是:
书的尺寸不正确!
它会显示
书的尺寸不正确!(预期 144,大小为 152)
我试着写这样的东西:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");
但是您不能在函数调用中使用字符串化 (#) 运算符。
我还尝试添加双字符串化技巧,如下所示:
#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)) ")");
但不是打印size is 152
,而是打印size is sizeof(Book)
.
有没有办法在 static_assert 中对 sizeof 的结果进行字符串化?