c++ - 如何有效地调试 constexpr 函数?

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

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

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

即使在“The C++ Programming Language, 4th Edition”中也有一句话说调试很困难。

最佳答案

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

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

在这里,您可以使用常规的单元测试、断言或运行时调试器来单步调试您的代码。与测试常规函数相比,这里没有什么新东西。

2) 确保它们可以在编译时进行评估

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

constexpr auto my_var = my_fun(my_arg);

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

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

幸运的是,因为您可以解耦 constexpr 函数的运行时和编译时行为,调试它们并不像调试模板元程序(只能在编译时运行)那么难.

关于c++ - 如何有效地调试 constexpr 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20966882/

相关文章:

c++ - 在不使用 std::bind 的情况下获取成员函数的 c++11 函数包装器

c++ - 无法从 C 应用程序访问 C++ DLL 中的变量

c# - VS 2015 Locals 窗口消失

c - 垂直直方图阵列打印问题

c++ - C++ 包装 C 代码的重复 const 错误

c++ - 为什么这里的三元运算符与 if-else 不同?

c++ - 第一次使用socket编程。连接没有发生。

c++ - 如何测量 Boost 图使用的内存?

javascript - Node.js 调试流程

c++ - 如何在插入过程中更改插入的值?