在我的应用程序中,内存使用情况非常关键。因此,我有特定的断言,在编译时检查内存大小,如果大小与我们之前认为正确的大小不同,则给出static_assert。如何将static_assert与sizeof和stringify结合起来?
我已经定义一个宏是这样的:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");
这个宏使得它很容易写:
CHECKMEM(Book,144);
CHECKMEM(Library,80);
的问题是,当这个static_assert熄灭,这可能是十分很难找出新的大小应该是什么(例如通过使用隐藏的编译器选项“/ d1 reportAllClassLayout”)。 如果我可以包含实际尺寸,将会更方便:
Book的尺寸不正确!
它会使
尺寸不正确的书! (预期144,大小为152)
我试着写是这样的:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");
但你不能使用stringize(#)运算符的函数调用。
我也尝试添加双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)) ")");
但不是打印size is 152
它打印size is sizeof(Book)
。
有没有办法在static_assert中对sizeof的结果进行字符串化?
请注意'sizeof'不是函数调用 – 2012-07-17 16:13:34
问题是'static_assert'的第二个参数必须是字符串文字,并且您不能在预处理器中构建它,因为您不能在其中使用sizeof 。 – pmr 2012-07-17 16:27:05