El uso de memoria es bastante crítico en mi aplicación. Por lo tanto, tengo afirmaciones específicas que comprueban el tamaño de la memoria en tiempo de compilación y dan un static_assert si el tamaño es diferente de lo que consideramos correcto antes.Cómo combinar static_assert con sizeof y stringify?
he definido una macro como esta:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");
Esta macro hace que sea muy fácil de escribir esto:
CHECKMEM(Book,144);
CHECKMEM(Library,80);
El problema es que cuando este static_assert se apaga, que podría ser bastante es difícil averiguar cuál debe ser el nuevo tamaño (por ejemplo, utilizando la opción del compilador oculto "/ d1 reportAllClassLayout"). Sería mucho más útil si pudiera incluir el tamaño real, entonces en lugar de:
¡Tamaño incorrecto de libro!
Esto mostraría
tamaño incorrecto para libro! (Esperado 144, el tamaño es 152)
intenté escribir algo como esto:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");
Pero no se puede utilizar el operador (#) stringize en una llamada de función.
También probé añadiendo el truco de doble stringize, así:
#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)) ")");
Pero en lugar de imprimir size is 152
Imprime size is sizeof(Book)
.
¿Hay alguna forma de codificar el resultado de sizeof en un static_assert?
Tenga en cuenta que 'sizeof' es * no * una llamada de función –
El problema es que el segundo argumento para' static_assert' debe ser un literal de cadena y no puede compilarlo en el preprocesador, ya que no puede usar sizeof allí . – pmr