类型B
的定义等于类型A
的定义,它只是一种较短的形式。它完美无缺。
所以我假设类型D
的定义再次等于类型C
的定义。然而,它会抛出下面打印的编译器错误。为什么?
type range_T is range 0 .. 255;
type A is array (range_T) of Integer;
type B is array (0 .. 255) of Integer;
type enum_T is (N, S, W, O);
type C is array (enum_T) of Integer;
type D is array (N, S, W, O) of Integer;
$gnatmake hello.adb 2>&1
gcc -c hello.adb
hello.adb:12:27: invalid subtype mark in discrete range
hello.adb:12:30: invalid subtype mark in discrete range
hello.adb:12:33: invalid subtype mark in discrete range
hello.adb:12:36: invalid subtype mark in discrete range
gnatmake: "hello.adb" compilation error
答案 0 :(得分:3)
问题是N, S, W, O
不是范围。通过syntax rules,它被视为一系列index_subtype_definitions - 它显然不是。
正确的语法(镜像你问题中的第一组定义)是这样的:
type enum_T is (N, S, W, O);
type C is array (enum_T) of Integer;
type D is array (N .. O) of Integer;