Где определяется 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.
Кроме того, я бы, вероятно, решил основную проблему, перехватывая функцию, которую нужно исправить, а не перекомпилируя весь модуль. Лично я считаю, что это менее агрессивно и легче поддерживать.
Почему я получаю предупреждение компилятора только за эту сборку проекта?
Некоторые идеи:
- У вас есть только один проект, который включает этот блок.
- У вас разные параметры компилятора в разных проектах. Возможно, только в одном из ваших проектов включены предупреждения, или только в одном проекте это конкретное предупреждение включено.
- У вас есть только один проект с определенным WIN32.
- Этот файл компилируется только один раз, но используется несколько раз. Возможно, потому что вы делаете скорее строительство.
Довольно сложно объяснить эту часть вашего вопроса. Независимо от того, когда код вашего вопроса скомпилирован с включенными предупреждениями, вы получите это предупреждение. Вы действительно сравниваете подписанный и неподписанный. Так что вам действительно нужно подавить предупреждение с помощью метода, который я предоставляю выше.
Помните, что предупреждение не означает, что ваш код не работает. Подавление этого предупреждения не изменит поведение кода. Когда вы видите это предупреждение, вы анализируете код, чтобы проверить, есть ли проблема. В этом случае код работает нормально, и вам просто нужно подавить предупреждение.