我有一个实现了许多功能的标记类型。在一种情况下,我需要这些功能之一来进入无限循环。不幸的是,据我所知,我没有办法对其进行编译,从而不会发出警告。我希望仍然使用-gnatwe
来确保我的代码中没有警告,但是如何实现这样的功能。
以下是该函数的外观:
function Foo (This : Some_Type) return Some_Type'Class is
begin
loop
Do_Useful_Stuff_Indefinitely_With (This);
end loop;
-- return This; (if needed?)
end Foo;
我尝试过pragma (No_Return)
,除了仅适用于过程(并且Foo
函数在其他地方用作适当的函数,因此必须具有相同的签名)。
我也尝试过pragma Suppress (All_Checks)
,但仍然会因代码无法到达或缺少返回语句错误而发出警告。
有什么办法可以使一次性功能永久运行而不会发出警告?
答案 0 :(得分:6)
采用让·弗朗索瓦(Jean-François)提供的示例,可以通过声明并调用一个“私有”过程(无需在spec中声明它)来避免该警告,该过程如下所示:
package body foo is
procedure Infinite_Loop is
begin
loop
null;
end loop;
end Infinite_Loop;
function bar return integer is
begin
Infinite_Loop;
return 12;
end bar;
end foo;
答案 1 :(得分:5)
pragma Suppress (All_Checks)
对运行时检查起作用。不会在那帮你。除非您专注于性能,否则就不要管它了,但是您可以选择-p
使用命令行开关来实现它
pragma Suppress禁止编译器生成的运行时检查。如果禁用了运行时检查,则可能会抑制异常,并可能导致未定义的行为。使用编译器抑制风险由程序员承担。
您需要return
语句,但是可以将其包装在2条pragma warnings
语句周围(在您尝试过将其关闭然后重新打开的情况下?有效)< / p>
pragma warnings(off,"unreachable code");
return This;
pragma warnings(on,"unreachable code");
请注意,该文本是可选的,但可以过滤其他可能发生的警告(如果需要)。最好关闭所有警告,因为这通常是不好的做法。
请注意,您必须在声明后再次打开警告。
独立演示。 foo.adb
看起来像:
package body foo is
function bar return integer is
begin
loop
null;
end loop;
pragma warnings(off,"unreachable code");
return 12;
pragma warnings(on,"unreachable code");
end bar;
end foo;
foo.ads
如下:
package foo is
function bar return integer;
end foo;
如果我将pragma
行注释掉:
$ gcc -c -gnatwe foo.adb
foo.adb:8:05: warning: unreachable code
取消注释它们将删除警告。