考虑以下VALUE
定义的编译时间常数
struct foo { uint32_t a; };
static constexpr int VALUE = sizeof(foo);
请注意,此处计算值的方式并不重要。
我想检索编译结果本身的值(示例中为 4) ;换句话说,我不想构建一个二进制文件并启动它以获得这个值。
我知道该选项-E
允许在预处理后停止,但现阶段该值尚不清楚。也许存在一些编译器选项可以允许这样做,但我不知道。
我能想到的唯一方法是放置一个static_assert(VALUE==-1)
会导致错误的值,并希望错误消息能够保存该值;似乎gcc
可以做到这一点,但不能clang
。
是否有更好的方法并且不依赖于编译器来获取编译本身的常量值?
这:
这打印:
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>'
在Compiler Explorer上亲自查看。对于所有这些,您可以继续 grep
error<[0-9]+>
来检索 4。static_assert
利用用户生成消息 ( P2741R3 )的 C++26 功能,您可以计算要在编译时发出的任何字符串:您可以有任何您想要的消息。也许是一个
constexpr
用于更复杂输出的 JSON 库。GCC 声称在 GCC 14 中支持这一点。它甚至接受它作为旧 C++ 版本中的扩展。
Clang 从 Clang 17 开始就支持这一点,但你必须处于
-std=c++2c
模式下,否则它根本无法解析。