Considere a seguinte constante de tempo de compilação VALUE
definida por
struct foo { uint32_t a; };
static constexpr int VALUE = sizeof(foo);
Observe que a forma como o valor é calculado não é importante aqui.
Gostaria de recuperar o próprio valor (4 no exemplo) como resultado da compilação ; em outras palavras, não quero construir um binário e iniciá-lo para obter esse valor.
Sei que essa opção -E
permite parar após o pré-processamento mas nesta fase o valor ainda não é conhecido. Talvez exista alguma opção de compilador que permita isso, mas não sei.
A única maneira que consigo pensar é colocar um static_assert(VALUE==-1)
que causará um erro e esperar que a mensagem de erro mantenha o valor; parece que gcc
pode fazer isso, mas não clang
.
Existe uma maneira melhor e não dependente do compilador de obter o valor constante como resultado da própria compilação?
Esse:
Isso imprime:
error: implicit instantiation of undefined template 'error<4>'
error: aggregate 'error<4> print' has incomplete type and cannot be defined
error: implicit instantiation of undefined template 'error<4>'
error C2079: 'print' uses undefined class 'error<4>'
Veja você mesmo no Compiler Explorer . Em todos eles, você poderia
error<[0-9]+>
recuperar o 4.Com o recurso C++26 de mensagens geradas pelo usuário
static_assert
( P2741R3 ), você pode calcular qualquer string a ser emitida em tempo de compilação:Você pode ter a mensagem que quiser. Talvez uma
constexpr
biblioteca JSON para uma saída mais complicada.O GCC afirma oferecer suporte a isso no GCC 14. Ele até aceita isso como uma extensão em versões mais antigas do C++.
Clang suporta isso desde Clang 17, mas você precisa estar no
-std=c++2c
modo ou ele simplesmente não será analisado.