Ada 抑制无法访问的代码或丢失 return
Ada suppress unreachable code or missing return
我有一个实现了许多功能的标记类型。在一种情况下,我需要这些函数之一来代替进入无限循环。不幸的是,据我所知,我无法编译它以使其不发出警告。我希望仍然使用 -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)
,但仍然针对无法访问的代码或缺少 return 语句错误发出警告。
有没有什么办法可以让一次性函数永远运行而不发出警告?
pragma Suppress (All_Checks)
作用于 运行-time 检查。不会帮你的。除非你专注于性能,否则不要管它,但是你可以 -p
选择使用命令行开关
The pragma Suppress suppresses compiler-generated run-time checks. If a run-time check is disabled, an exception may be suppressed and undefined behavior could result. pragma Suppress is used at the programmer's risk.
您需要 return
语句,但您可以将其包装在 2 个 pragma warnings
语句周围(您是否尝试过将其关闭并再次打开? 有效)
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
取消注释它们会删除警告。
使用 Jean-François 提供的相同示例,您可以通过声明和调用 "private" 过程(您不必在规范中声明它)来包装您的循环来避免警告,如下所示:
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;
我有一个实现了许多功能的标记类型。在一种情况下,我需要这些函数之一来代替进入无限循环。不幸的是,据我所知,我无法编译它以使其不发出警告。我希望仍然使用 -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)
,但仍然针对无法访问的代码或缺少 return 语句错误发出警告。
有没有什么办法可以让一次性函数永远运行而不发出警告?
pragma Suppress (All_Checks)
作用于 运行-time 检查。不会帮你的。除非你专注于性能,否则不要管它,但是你可以 -p
选择使用命令行开关
The pragma Suppress suppresses compiler-generated run-time checks. If a run-time check is disabled, an exception may be suppressed and undefined behavior could result. pragma Suppress is used at the programmer's risk.
您需要 return
语句,但您可以将其包装在 2 个 pragma warnings
语句周围(您是否尝试过将其关闭并再次打开? 有效)
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
取消注释它们会删除警告。
使用 Jean-François 提供的相同示例,您可以通过声明和调用 "private" 过程(您不必在规范中声明它)来包装您的循环来避免警告,如下所示:
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;