Как объединить статические _assert с sizeof и stringify?

Использование памяти очень важно в моем приложении. Поэтому у меня есть специальные утверждения, которые проверяют размер памяти во время компиляции и выдают статическое _утверждение, если размер отличается от того, что мы считали правильным ранее.

Я определил такой макрос:

#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 в статическом утверждении _?

17
задан ildjarn 17 July 2012 в 16:27
поделиться