Ada - предупреждение компилятора об определении типа "mod 64" - PullRequest
2 голосов
/ 09 ноября 2019

Мне требуется модульный целочисленный тип с допустимыми значениями от 0 до 63 включительно. Такие как ...

type Mix_Byte is mod 64;

Это компилируется и работает, как и ожидалось, но компилятор старательно обращает мое внимание на возможный недосмотр с моей стороны ...

warning: 2 ** 64 may have been intended here

Как это происходитЯ вовсе не собираюсь этого делать, но приятно знать, что компилятор находится на виду:)

Кажется, это предупреждение только для значений 32 или 64, но не для 8, 16 или 128. Японимать, что 32 и 64 являются общими целочисленными размерами, и в этих случаях 2 ** n будет иметь смысл.

Как отключить это конкретное предупреждение компилятора для этого конкретного экземпляра (я хочу разрешить его глобально на протяжении всего проекта в случаеЯ совершаю настоящую ошибку в другом месте).

Я предполагаю, что могу сформулировать код по-другому, чтобы быть более точным с моим смыслом?

Ответы [ 2 ]

4 голосов
/ 09 ноября 2019

Некоторая дополнительная справочная информация (кроме ответа egilhh): проверка выполняется в freeze.adb (см. здесь ). Предупреждение можно включить / отключить с помощью -gnatw.m/.M. (см. Вывод gnatmake --help). Вы можете временно отключить предупреждение, используя прагму Warnings (см. Также здесь и здесь ):

main.adb

procedure Main is

   pragma Warnings (Off, "*may have been intended here");
   type Mix_Byte_1 is mod 64;
   pragma Warnings (On, "*may have been intended here");

   type Mix_Byte_2 is mod 64;   --  Line 7

begin
   null;
end Main;

выход (комари)

$ gcc -c main.adb
main.adb:7:27: warning: 2 ** 64 may have been intended here
4 голосов
/ 09 ноября 2019

Вы можете попытаться записать его как степень двух:

type Mix_Byte is mod 2**6;

Редактировать:

В качестве альтернативы (на основании дополнительной информации в вашем комментарии) вы можете использовать именованное число какмодуль:

Modulus : constant := 64;
type Mix_Byte is mod Modulus;
...