从函数返回完全不同的数据类型 我试图把我的编程语言的代码库从Lua翻译成C++。我刚刚开始。我不是C++专家,我希望我能在写作的时候学到更多,但是我已经遇到了一个让我停止的障碍。

从函数返回完全不同的数据类型 我试图把我的编程语言的代码库从Lua翻译成C++。我刚刚开始。我不是C++专家,我希望我能在写作的时候学到更多,但是我已经遇到了一个让我停止的障碍。,c++,return,return-type,C++,Return,Return Type,我现在正在编写词法分析器模块。它应该返回标记的双链接列表,但当然,在分析源代码时可能会出现错误,例如,当一个多行注释或字符串没有结束括号之类的东西时 当然,当我遇到错误时,我可以打印消息并结束程序。但是因为我想让这些错误可以处理,我能想到的最简单的事情就是返回这些错误,这样如果一个错误处理函数得到这个错误,它就可以处理它,但是如果它一直到解释器,它的消息就会被打印出来 在卢阿,这很容易。如果词法分析器函数在传递的文本中没有遇到错误,我可以让函数返回标记的双链接列表(我在那里使用了无大小数组,但这

我现在正在编写词法分析器模块。它应该返回标记的双链接列表,但当然,在分析源代码时可能会出现错误,例如,当一个多行注释或字符串没有结束括号之类的东西时

当然,当我遇到错误时,我可以打印消息并结束程序。但是因为我想让这些错误可以处理,我能想到的最简单的事情就是返回这些错误,这样如果一个错误处理函数得到这个错误,它就可以处理它,但是如果它一直到解释器,它的消息就会被打印出来

在卢阿,这很容易。如果词法分析器函数在传递的文本中没有遇到错误,我可以让函数返回标记的双链接列表(我在那里使用了无大小数组,但这并不重要),或者返回调用方要处理的错误对象

<>因为C++必须指定返回类型,如果需要,如何使函数返回错误对象,以便正确地处理它?或者我应该改变方法,使用其他方法而不是返回系统


遗憾的是,我无法搜索像Python这样的巨大的代码库,看看它们是如何处理这种情况的,所以即使是对这些文件的链接也可以帮助。

< P>如果只是为了处理错误,你可能会想使用,因为这是C++中的标准错误处理机制。当然,你必须捕捉并处理某些异常,否则C++程序会停止运行。 如果您真的需要一种方法从单个函数中获取几种可能的返回类型,您可以尝试。这种方法的缺点是,您需要一种方法向函数的调用者指示您实际返回的类型,并且调用者需要检查各种可能性

除了我可以给你一个一般的建议:虽然我不知道你把代码库从Lua翻译成C++的动机,但是我不建议这么做只是为了让所有代码都在C++中可用,只要LUA代码为你工作。您将很可能遇到更多这样的情况,无法充分地将语言特征从Lua翻译成C++。


<> P>而不是你可以尝试用一个包装器直接从C++中使用Lua,如果你需要一个方法来与C++的Lua交互。

< P>如果只是为了处理错误,你可能会想使用,因为这是C++中的标准错误处理机制。当然,你必须捕捉并处理某些异常,否则C++程序会停止运行。 如果您真的需要一种方法从单个函数中获取几种可能的返回类型,您可以尝试。这种方法的缺点是,您需要一种方法向函数的调用者指示您实际返回的类型,并且调用者需要检查各种可能性

除了我可以给你一个一般的建议:虽然我不知道你把代码库从Lua翻译成C++的动机,但是我不建议这么做只是为了让所有代码都在C++中可用,只要LUA代码为你工作。您将很可能遇到更多这样的情况,无法充分地将语言特征从Lua翻译成C++。


而不是你可以尝试用一个包装器直接从C++中使用Lua,如果你需要一个方法来与C++的Lua进行交互。

< p>让词法分析器返回一个封装结果的对象和一个标志来指示成败,例如

struct Result {
  bool isValid; //flag to indicate of the result is valid

  //result from the analyzer
  std::list<int> list; 
};

让词法分析器返回封装结果的对象和指示成功或失败的标志,例如

struct Result {
  bool isValid; //flag to indicate of the result is valid

  //result from the analyzer
  std::list<int> list; 
};

继承-基类
Error
携带一条消息和一个位置-控制台/日志部分应该与之匹配。从
Error
派生您的特定类,以携带“恢复代码”执行其工作所需的信息。啊,并将这些错误返回为
std::shared\u ptr
。对于令牌列表的实际返回,请在函数参数(指针/引用)继承中返回它们-基类
错误
包含消息和位置-控制台/日志记录部分应与之匹配。从
Error
派生您的特定类,以携带“恢复代码”执行其工作所需的信息。啊,并将这些错误返回为
std::shared\u ptr
。对于令牌列表的实际返回,请返回它们的函数参数(指针/引用),您的意思是C++异常,用于我的语言异常?这看起来很有用,我当然没想过。至于Lua到C++,它是为了便携性、性能,甚至因为我找不到Lua的DIAMAMION的一些bug的来源。除此之外,我不太明白你的意思是工会部分。怎样才能使用这些呢?是的,我是说C++例外。至于可移植性:在我看来,Lua是一种解释性语言,已经相当可移植了,但您的理解可能会有所不同。性能可能是由Lua的问题引起的,但与性能一样:基准测试/度量它。有时你可能会得到意想不到的结果。我刚刚在LuaAPI +库中添加了一个关于C++的Lua包装器。Lua和C++之间也可能存在其他类型的语言绑定,允许你从C++中重新使用Lua。TBH C++异常已经从大量的样板代码中拯救了我:在Lua,当我从另一个代码> PARSENETROMENT/CODE>调用时,比如说,“代码> PARSENETROMENT/<代码>,我必须检查它是否返回了EXP的表示形式。