Использование памяти очень важно в моем приложении. Поэтому у меня есть специальные утверждения, которые проверяют размер памяти во время компиляции и выдают статическое _утверждение, если размер отличается от того, что мы считали правильным ранее.
Я определил такой макрос:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");
Этот макрос позволяет очень легко написать это:
CHECKMEM(Book,144);
CHECKMEM(Library,80);
Проблема в том, что когда это статическое _утверждение срабатывает, может быть довольно сложно выяснить, каким должен быть новый размер (, например. с помощью скрытой опции компилятора "/d1 reportAllClassLayout" ). Было бы намного удобнее, если бы я мог указать фактический размер, поэтому вместо:
Size incorrect for Book!
Это покажет
Size incorrect for Book! (expected 144, size is 152)
Я пытался написать что-то вроде этого:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");
Но вы не можете использовать оператор 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)
.
Есть ли способ упорядочить результат sizeof в статическом утверждении _?