2

在gnat ada中是否有c 宏 __LINE__, __FILE__,的等价物__func__?这些在错误消息中非常有帮助,可以快速找到代码中的错误。也许还有另一个概念来归档相同的目标。?

4

3 回答 3

6

我手头没有要检查的安装,但文档说GNAT.Source_Info包“提供了可以访问编译时已知的源代码信息的子程序,例如当前文件名和行号。” adacore 有包的规格(通过 Christoph)

于 2014-09-11T13:16:25.760 回答
2

抱歉,__LINE__and__FILE__和其他__THING__s 是 C 预处理器的功能,ADA 不具备这些功能。您可能会临时装配一个简单的 perl 脚本(或类似脚本)来预先运行您的代码以进行模拟__LINE____FILE__但这__func__会更加困难,因为这意味着实际解析代码。

啊,原来它存在于GNAT中。例子:

with Ada.Text_IO
GNAT.Source_Info;
use  Ada.Text_IO
GNAT.Source_Info;

procedure source_error is
  -- example of GNAT.Source_Info.Source_Location
  i : integer;
  j : integer := 0;
begin
  i := 5/j; -- division by zero
exception when others =>
  put_line( standard_error
Source_Location & ": exception raised" );
end source_error;
于 2014-09-11T13:03:16.763 回答
0

另一种方法是在异常时打印堆栈跟踪。有一些 GNAT binder 参数可以启用堆栈跟踪 (-E?) 的存储,然后您可以使用 Ada.Exceptions 包打印它们。还有一个包可以在任何时候或从异常发生时打印堆栈(我总是为所有任务提供最后的处理程序)。见http://rosettacode.org/wiki/Stack_traces#Ada

根据我的经验,异常堆栈跟踪是查明问题的理想选择。

于 2014-10-06T21:58:39.833 回答