C++ 编译时调试

non*_*741 5 c++ compilation constexpr c++20 consteval

在该准则下constexpr everything,随着constevalC++20的引入,越来越多的代码在编译时被评估。

这导致了一个显而易见的问题:我们如何调试它?

目前唯一的提示是编译器错误。但是如果代码编译了,但仍然没有达到预期的效果怎么办。有什么工具可以帮助解决这个问题吗?有没有检查的可能?

一个相关的问题是:如何知道哪些会在编译时真正被“执行”,哪些会在有限定符的情况下保持运行。

Spy*_*tos 4

我个人使用 static_assert 作为 constexpr 函数的调试器,它不是最好的工具,但它可以替换类似代码。一个if (irational_value) cout<<"bug"; 在编译时评估第 6 个斐波那契数是否实际上是 13 的愚蠢示例

#include <vector>
#include <iostream>

int main(){
    constexpr unsigned sixth_fib=[](){
        unsigned prev=1;
        unsigned sum=1;
        for (unsigned i=0;i<5;i++)
        {
            auto tmp=sum;
            sum+=prev;
            prev=tmp;

        }
        return sum;
    }();
    static_assert(sixth_fib==13);
    std::cout<<sixth_fib<<std::endl;

}
Run Code Online (Sandbox Code Playgroud)