【发布时间】:2012-07-16 14:41:30
【问题描述】:
内存使用在我的应用程序中非常重要。因此,我有特定的断言在编译时检查内存大小,如果大小与我们之前认为正确的大小不同,则给出 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 的结果进行字符串化?
【问题讨论】:
-
请注意,
sizeof不是函数调用 -
问题是
static_assert的第二个参数必须是字符串文字,并且你不能在预处理器中构建它,因为你不能在那里使用 sizeof。
标签: c++ visual-studio-2010 c++11 stringify static-assert