У меня есть группа проектов, в которой все программы 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 ни в операторах using, ни в файлах проекта.

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

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

3
Jan Doggen 23 Окт 2012 в 19:17

1 ответ

Лучший ответ

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

if size > size_t(MaxInt) then

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

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


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

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

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

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

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

5
David Heffernan 24 Окт 2012 в 17:41
Мне следовало уделить больше внимания вопросу, который действительно сбивает меня с толку: почему я получаю предупреждение компилятора только для этой сборки проекта? ". Я соответствующим образом отредактировал свой исходный пост. Есть идеи?
 – 
Jan Doggen
24 Окт 2012 в 10:15
1
Сложно сказать отсюда. Могут быть разные варианты компилятора. Или это могло быть условно. Этот код компилируется только для 32-битных сборок Windows. Но поймите, что предупреждения следует ожидать. Легко видеть, что код действительно сравнивает значения со знаком и без знака. Думаю, я ответил на ваш вопрос.
 – 
David Heffernan
24 Окт 2012 в 10:21
Вы ищете здесь больше? Я не могу думать ни о чем, что бы я не затронул.
 – 
David Heffernan
24 Окт 2012 в 17:38
Кто-то включил настройку компилятора «Предупреждения - сравнение подписанных и неподписанных типов» только для этой одной программы. [Я думаю, что "выключено" - это стандартная настройка XE2 по умолчанию].
 – 
Jan Doggen
26 Окт 2012 в 15:17