当我在 red hat linux 中制作 ncurses-5.9
时,出现以下问题:
gcc -c -g -O2 -gnatafno -gnatVa -gnatwa -I- -gnatA /home/xiaodobl/ncurses-5.9/Ada95/src/terminal_interface-curses-mouse.adb
错误是:
terminal_interface-curses-mouse.ads:180:10: size for "Event_Mask" too small, minimum allowed is 64
如何解决这个问题?
最佳答案
没有看到terminal_interface-curses-mouse.ads
中的相关声明,我不能确定。但是,我怀疑 Event_Mask
的大小存在冲突。 。当我尝试时,这条线被硬连接到 terminal_interface-curses-mouse.ads.m4
:
type Event_Mask is new Interfaces.C.unsigned_long;
但是 Mouse_Event
的代表子句定义Bstate
,类型为Event_Mask
,像这样:
Bstate at 0 range 128 .. 159;
这是基于 mmask_t
的类型在<ncurses.h>
,即unsigned
在我的系统上。如果unsigned_long
是 64 位和 C 的 unsigned
类型是32,编译器会报错。
如果出现这种情况,请尝试手动更改 type Event_Mask
行至
type Event_Mask is new Interfaces.C.unsigned_long range 0 .. 2**32 - 1;
for Event_Mask'Size use 32;
或
type Event_Mask is new Interfaces.C.unsigned_long range 0 .. 2**32 - 1 with Size => 32;
这有望避免“大小太小”问题,而不会在其余代码中引起任何新的类型冲突。不过我还没有测试过。
这应该被报告为错误,因为 Event_Mask
的类型不应该像这样硬连线。
编辑:直到后来我才意识到 Event_Mask
是派生类型,从 Interfaces.C.unsigned_long
派生它没有任何好处有范围限制。假设mmask_t
定义为unsigned
在 .h
文件,它应该也可以说
type Event_Mask is new Interfaces.C.unsigned;
你仍然需要手动更改它,而且确实是 .m4
文件和生成器需要修复才能找出正确的类型,这就是为什么我认为这应该被视为 ncurses
中的错误.
关于linux - "Event_Mask"的大小太小,允许的最小值为 64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24646443/