如何有效地调试constexpr功能?

时间:2014-01-07 08:18:21

标签: c++ debugging c++11 constexpr c++14

在C ++ 14中,我们得到upgraded version of constexpr,这意味着现在可以使用循环,if语句和开关。 递归已经成为可能,就像在C ++ 11中一样。

我了解constexpr函数/代码应该非常简单,但问题仍然存在:如何有效地调试它?

即使在“ C ++编程语言,第4版”中,也有一句话说调试很难。

3 个答案:

答案 0 :(得分:6)

调试constexpr函数有两个重要方面。

1)确保他们计算出正确的结果

在这里,您可以使用常规单元测试,断言或运行时调试程序来逐步执行代码。与测试常规功能相比,没有什么新东西了。

2)确保可以在编译时对其进行评估

可以通过将函数评估为constexpr变量赋值的右侧来测试。

constexpr auto my_var = my_fun(my_arg);

为了使其工作,my_fun可以a)只有编译时常量表达式作为实际参数。即my_arg是文字(内置或用户定义)或以前计算的constexpr变量或模板参数等,b)它只能在其实现中调用constexpr函数(所以没有虚拟,没有lambda表达等。)。

注意:在constexpr函数的编译时评估期间,实际调试编译器的代码生成实现非常困难。您必须将调试器附加到编译器,并且实际上能够解释代码路径。也许某些未来版本的Clang会让你这样做,但这对现有技术来说是不可行的。

幸运的是,因为您可以解耦constexpr函数的运行时和编译时行为,所以调试它们的难度不如调试模板元程序(只能在编译时运行)的一半。

答案 1 :(得分:2)

我在2015年4月3日写的答案显然是错误的。我无法理解我的想法。

这是“真正的”答案 - 我现在使用的方法。

a)像往常一样编写constexpr函数。到目前为止,它不起作用。

b)在编译时调用该函数 - 编译失败时只有一条消息“effect constexpr”功能无效。这使得很难知道问题究竟是什么。

c)制作小型测试程序,该程序使用仅在运行时知道的参数调用该函数。使用调试器运行测试程序。您会发现您可以以正常方式追踪该功能。

我花了很长时间才弄明白这一点。

答案 2 :(得分:0)

如果通过调试你的意思是“让某个表达式不是一个理想的值”,你可以在运行时检查它

#include <stdexcept>
#include <iostream>

constexpr int test(int x){ return x> 0 ? x : (throw std::domain_error("wtf")); }

int main()
{
  test(42);
  std::cout<< "42\n";
  test(-1);
  std::cout<< "-1\n";
}