2014-07-26 25 views
0

在Ada中,我有以下非常简单的代码,这让我很悲伤。我修剪下来的代码到最小,借以说明问题,你需要知道的唯一的事情就是Some_Task是一个任务类型:Ada编译器:警告变量<X>被分配但从未读取

task body TB is 
    Task1 : Some_Task_Ref; 
begin 
    Task1 := new Some_Task; 
    loop 
     Put_Line("Main loop is running, whatever..."); 
     delay 5.0; 
    end loop; 
end TB; 

据我了解有关任务激活Ada中这应该是足够了:我创建一个类型为“Some_Task”的任务,我不必对它做任何事情,它将执行它的主循环,而无需任何干预。这不像在java中你必须调用任务对象上的“开始”方法。

但如果我是正确的,为什么编译器拒绝建立,给我的错误:

warning variable "Task1" is assigned but never read 

我为什么要被迫“读”任务1?这是一项任务,它需要做的就是跑步......我错过了什么?

注意:这只有当我在“Gnat模式”(开关-gnatg)中使用GNAT时才会发生。不幸的是,我需要一些高级编译指示这种模式,但它似乎引入了一些“overzelous”检查,如导致上述问题的检查。我怎样才能停用那张支票?

+1

尝试禁用了使用'pragma'这个变量警告:'编译警告(关,Some_Task_Ref);' – Holt

+2

或'Pragma Unreferenced(Task1);' –

+0

@Holt:这工作,谢谢,虽然现在事实证明,即使这种修复它不起作用,但我会为此打开一个新的问题... –

回答

0

只是为了回答这个问题,因为答案被张贴在一个评论,它不能标记作为答案。

正如霍尔特说(所有道具给他)这可以固定使用:

pragma Warnings (Off, Some_Task_Ref) ; 
2

这是一个警告,而不是一个错误,并且不会阻止构建可执行文件(除非您已打开“将警告视为错误”)。这是编译器的一个暗示,你可能在创建一个永远不会使用的变量时犯了一个错误。你可以告诉你不indend通过声明它作为一个常量使用任务1编译,就像这样:

Task1 : constant Some_Task_Ref := new Some_Task; 
+0

不幸的是, “-gnatg”选项强制“将警告视为错误”,我需要它使用“pragma Pure_12”。有没有办法在不使用-gnatg的情况下使用该编译指示,或者在使用-gnatg时禁用警告? 而在完整的代码中,我需要在正文中创建任务,因为它需要其他东西来工作,所以不能使其保持不变。 –

+0

您是否尝试使用“-gnat12”而不是“-gnatg”? – egilhh