构建GCC Ada时,使用非常旧的gnatmake编译s-excmac.adb时出现语法错误
我正在尝试更新我们已有20年历史的Ada编译器,但是您需要一个Ada编译器来构建GCC+Ada(9.2.0)的某些部分 gnatmake大约是2000年,它可能是gcc2.8.1的子调用。唉 我已经成功地构建了GCC的几个Ada部分,但我无法理解这个构建GCC Ada时,使用非常旧的gnatmake编译s-excmac.adb时出现语法错误,gcc,ada,Gcc,Ada,我正在尝试更新我们已有20年历史的Ada编译器,但是您需要一个Ada编译器来构建GCC+Ada(9.2.0)的某些部分 gnatmake大约是2000年,它可能是gcc2.8.1的子调用。唉 我已经成功地构建了GCC的几个Ada部分,但我无法理解这个libgnat/文件: 编译libgnat/s-excmac.adb: $ gnatmake s-excmac.adb gcc -c -gnatpg s-excmac.adb s-excmac.ads:134:44: identifier expec
libgnat/
文件:
编译libgnat/s-excmac.adb:
$ gnatmake s-excmac.adb
gcc -c -gnatpg s-excmac.adb
s-excmac.ads:134:44: identifier expected
gnatmake: "s-excmac.adb" compilation error
因此,s-excmac.ads
中有问题的一行是:
type GCC_Exception_Access is access all Unwind_Exception;
-- Pointer to a GCC exception
procedure Unwind_DeleteException (Excp : not null GCC_Exception_Access ); -- <-- THIS ONE!
pragma Import (C, Unwind_DeleteException, "_Unwind_DeleteException");
-- Procedure to free any GCC exception
类型GCC\u Exception\u Access为Access all Unwind\u Exception;
--指向GCC异常的指针
过程展开_DeleteException(Excp:非空GCC _Exception _Access);-- 如果编译器的版本早于2005,那么编译Ada-2005notnull访问
声明将是一个问题
要继续,您可以删除单词“notnull
”,该行将编译并工作,但如果传入null访问类型,您将无法获得所需的行为(异常中止)。更好的修复方法是显式检查包装程序,并根据需要引发异常或调用底层C procoughvoid函数
此外,可能还有其他Ada-2005特性也无法编译,因此更好的选择是编译器升级 Brian关于非空值的看法是正确的。但代码中可能会有更多的2005 ISM
我相信维护人员只会保证使用以前的版本构建编译器的能力,这意味着构建GCC 3,使用它构建GCC 4,等等;您可能可以跳过一两个版本。漫长的未来 我想,构建libgnat
是最新的一步。我的意思是,您需要使用旧的gcc构建“新gcc”,然后使用“新gcc”构建libgnat
。在这种情况下,你不会得到这个错误。并且在GCC 4.7和更高的地方,没有C++编译器(除了艾达和C),编译该路径是不可能的。