c宏__LINE __,__ FILE __,__ func__等效于gnat ada

时间:2014-09-11 12:23:16

标签: c macros ada gnat

gnat __LINE____FILE____func__的{​​{3}} ada中是否有等价物?这些在错误消息中非常有用,可以快速找到代码中的错误。也许还有另一个概念来归档同一个目标。?

3 个答案:

答案 0 :(得分:4)

我手边没有安装检查,但是文档说包GNAT.Source_Info"提供的子程序可以访问编译时已知的源代码信息,例如当前文件名和行号。"和adacore有spec for the package(通过Christoph)

答案 1 :(得分:1)

抱歉,__LINE____FILE__以及其他__THING__是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;

答案 2 :(得分:0)

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

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