Где определяется maxint - дублированное определение?

У меня есть проектная группа, в которой все программы Win32 имеют одинаковый путь поиска..\PatchLibs. Эта папка содержит исправленный System.Win.Ctrl.pas, содержащий:

{$IFDEF WIN32}
function _malloc(size: size_t): Pointer; cdecl;
begin
  if (size > MaxInt) then 
  begin                   
     Result := Nil
  end
  else
  begin
     try
        Result := AllocMem(size);
     except
        Result := Nil;
     end;
  end;
end;

[Этот патч подавляет ошибку в midaslib (QC 104337)]

Проблема:

Один из (меньших) проектов выдает предупреждение компилятора W1023 ("сравнение типов со знаком и без знака") в строке "MaxInt", все остальные собираются без предупреждений.
Ни один из проектов не имеет System.Win.Ctrl в своих инструкциях использования или в файлах своих проектов.

Подумав, что для Maxint может быть два типизированных определения констант, я хотел поставить префикс Maxint с "правильным" именем устройства, но не могу найти его определение.
Я искал все доступные файлы c:\program files (x86)\embarcadero\rad studio\9.0\source*.*, Но не нашел определений.
System.MaxInt работает, но не устраняет предупреждение.
Typecasting Cardinal (MaxInt) удаляет предупреждение, но я все же предпочел бы "полностью квалифицированное" решение.
(size_t определяется как ULONG_PTR определяется как NativeUInt)
Я обнаружил, что Quality Central выпускают 102873, 69836 и 53202, но они относятся к дублирующим определениям заголовочных файлов C++ .h

Правильно ли мое предположение о более чем одном определении? Если так, каким будет / должен быть префикс устройства? И самое главное: почему я получаю предупреждение компилятора только за эту сборку проекта?

1 ответ

Решение

MaxInt объявлен в Системном блоке. Я почти уверен, что это единственный MaxInt, который находится здесь. Предупреждение, которое вы видите, является точным. MaxInt подписан, а size_t не подписан. Вы должны подавить предупреждение. Например, вы можете привести MaxInt к size_t:

if size > size_t(MaxInt) then

Это нормально, потому что MaxInt находится в диапазоне значений size_t.

Кроме того, я бы, вероятно, решил основную проблему, перехватывая функцию, которую нужно исправить, а не перекомпилируя весь модуль. Лично я считаю, что это менее агрессивно и легче поддерживать.


Почему я получаю предупреждение компилятора только за эту сборку проекта?

Некоторые идеи:

  1. У вас есть только один проект, который включает этот блок.
  2. У вас разные параметры компилятора в разных проектах. Возможно, только в одном из ваших проектов включены предупреждения, или только в одном проекте это конкретное предупреждение включено.
  3. У вас есть только один проект с определенным WIN32.
  4. Этот файл компилируется только один раз, но используется несколько раз. Возможно, потому что вы делаете скорее строительство.

Довольно сложно объяснить эту часть вашего вопроса. Независимо от того, когда код вашего вопроса скомпилирован с включенными предупреждениями, вы получите это предупреждение. Вы действительно сравниваете подписанный и неподписанный. Так что вам действительно нужно подавить предупреждение с помощью метода, который я предоставляю выше.

Помните, что предупреждение не означает, что ваш код не работает. Подавление этого предупреждения не изменит поведение кода. Когда вы видите это предупреждение, вы анализируете код, чтобы проверить, есть ли проблема. В этом случае код работает нормально, и вам просто нужно подавить предупреждение.

Другие вопросы по тегам