考虑以下代码(使用GCC 4.7.4编译):
procedure Main is
procedure Sub_Proc(N : in out Integer) is
M : Integer;
begin
M := N;
end;
procedure Proc(N : out Integer) is
begin
Sub_Proc(N);
end;
N : Integer;
begin
Proc(N);
end Main;
程序Proc
应该确保永远不会在他的身体内读取作为 out参数的参数N
。但它将此参数传递给过程Sub_Proc
,该过程在
是GCC错误还是Ada标准特异性?
答案 0 :(得分:7)
您将在Sub_Proc(N);
来电时收到警告:"N" may be referenced before it has a value
。所以编译器试图提供帮助!
在Ada 83中,你的程序本来是非法的:6.4.1(3)说“对于模式输出,变量不能是模式输出的形式参数”。的确,使用{{1在对代码进行小规模重新排列以允许编译之后,与上述警告相当的是错误-gnat83
。
在Ada 95和Ada 2012中, 可以在分配后查看(Ada 83) illegal reading of out parameter
参数的值;在ARM95 6.4.1(15)中,我们发现该值未初始化(如上面提到的警告消息所示),因此使用它是一个坏主意。
所以答案是,GNAT的行为符合标准。