作为一个附加组件,我想提一下,C++11 使用 constexpr 关键字在某种程度上对事物进行了编码。例子:
#include <iostream>
#include <cstring>
constexpr unsigned static_strlen(const char * str, unsigned offset = 0) {
return (*str == '\0') ? offset : static_strlen(str + 1, offset + 1);
}
constexpr const char * str = "asdfjkl;";
constexpr unsigned len = static_strlen(str); //MUST be evaluated at compile time
//so, for example, this: int arr[len]; is legal, as len is a constant.
int main() {
std::cout << len << std::endl << std::strlen(str) << std::endl;
return 0;
}
对 constexpr 使用的限制使得该函数可以证明是纯的。这样,编译器可以更积极地优化(请确保您使用尾递归!)并在编译时而不是运行时评估函数。
因此,要回答您的问题,如果您使用的是 C++(我知道您说的是 C,但它们是相关的),以正确的样式编写纯函数允许编译器使用该函数执行各种很酷的事情: -)