如果函数值为空,则返回
Return if function value is null
我正在编写一个练习编译器,如果在当前范围内找到某个符号,则lookup_helper(键,当前(返回指向某个符号的指针。for(( 循环遍历所有作用域并搜索某个符号,直到找到它并返回它。否则返回 nullptr。
Symbol * lookup()
{
//....
//....
//search all scopes
for (int i = Scopes.size(); i > 0; i--)
{
Scope current = Scopes[i - 1];
if (lookup_helper(key, current)) //not good design
return lookup_helper(key, current); //calling second time
}
return nullptr; //not found
}
这段代码不是调用 lookup_helper(( 两次吗?一次在 if(( 中,一次在返回中?我有这个问题的解决方案,但我正在寻找一个更优雅的解决方案,只调用lookup_helper一次(我也不想创建一些变量来存储返回值(。也许我问的是不可能的,因为我必须跳到代码的执行中来确定lookup_helper是否返回 nullptr。
我想象的优雅:(不是这样工作的(
for (int i = Scopes.size(); i > 0; i--)
{
Scope current = Scopes[i];
return (ifnotnull) lookup_helper(key, current);
}
是的,您的代码调用lookup_helper
两次。一些编译器可能能够消除第二次调用,如果他们知道函数是"纯的"(使用 GCC 术语(。但是,在C++中,它是最好手动和显式完成的"优化"之一。
至于如何避免第二次调用,通常是通过在尝试分析之前将结果存储在中间变量中来完成的。
...
Symbol *symbol = lookup_helper(key, current);
if (symbol != nullptr)
return symbol;
....
在最内部的范围内使用局部变量,您可以这样做
for (int i = Scopes.size(); i > 0; i--) {
if (auto ret = lookup_helper(key, Scopes[i])) {
return ret;
}
}
或更传统的
for (int i = Scopes.size(); i > 0; i--) {
auto ret = lookup_helper(key, Scopes[i]);
if (ret) {
return ret;
}
}
是的,您的代码将调用lookup_helper两次。一个简单的解决方案是将结果存储到局部变量中:
...
for(auto & scope : Scopes) {
auto ret = lookup_helper(key, scope);
if(ret) return ret;
}
...
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数