在C ++ 14中,我们得到upgraded version of constexpr
,这意味着现在可以使用循环,if语句和开关。
递归已经成为可能,就像在C ++ 11中一样。
我了解constexpr
函数/代码应该非常简单,但问题仍然存在:如何有效地调试它?
即使在“ C ++编程语言,第4版”中,也有一句话说调试很难。
答案 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";
}