Использование памяти в моем приложении довольно критично. Поэтому у меня есть конкретные утверждения, которые проверяют размер памяти во время компиляции и дают 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) ")");
Но вы не можете использовать оператор 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 в static_assert?