【问题标题】:Compile-time debugging in C++C++ 中的编译时调试
【发布时间】:2020-12-05 17:20:14
【问题描述】:

constexpr everything 准则下以及随着 C++20 中 consteval 的引入,越来越多的代码在编译时被评估。

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

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

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

【问题讨论】:

  • constexpr 函数可以在非 constexpr 上下文中调用,您可以将它们作为常规函数进行调试。
  • @Jarod42:这不适用于已标记的consteval。您也不能轻松地使用 constexpr 函数进行调试;虽然您可以使用std::is_constant_evaluated,但这无助于复制常量表达式中的任何用法。
  • 偶然发现这个 2017 Herb Sutter 演讲:youtu.be/4AfRAVcThyA?t=1807 右下角说:C++17 => 需要编译时调试。一分钟后,他甚至列出了 compile-time watch。从那以后过去的三年里,它做了什么? ;-)

标签: c++ compilation constexpr c++20 consteval


【解决方案1】:

我个人使用 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;

}

【讨论】:

  • static_assertcout&lt;&lt;"bug" 在哪个 Universe 中调用调试???
  • 居然在这个! print debugging 。我不是说它是一个完整的调试机制,但什么都不是。有人必须为一个大程序使用各种调试方法才能使用这种方法是最“即时”的方法,你可以在任何地方使用,但请记住,机会是您将永远不必在 constexpr 上下文中进行堆栈跟踪或检查内存泄漏,因此 constexpr 没有 valgrind 。但确实我相信在 constexpr 上下文中拥有 gdb 会很棒
猜你喜欢
  • 2010-10-13
  • 2011-09-17
  • 2016-08-02
  • 2016-06-19
  • 2017-02-13
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多