Есть ли способ получить имя текущего модуля из включаемого файла?
-
06-09-2019 - |
Вопрос
Я переношу некоторый код из одной библиотеки фреймворка в другую, что требует от меня закомментировать большие разделы кода только для того, чтобы он скомпилировался, а затем тщательно их восстановить.Тем временем я получаю массу предупреждений из-за всего закомментированного кода.Поэтому я решил написать быстрый подключаемый файл, чтобы подавить их:
{$MESSAGE WARN 'Warnings suppressed for unported unit with commented-out code'}
{$WARN NO_RETVAL OFF}
{$WARN USE_BEFORE_DEF OFF}
Я включил это во все модули, которые выдают мне массу предупреждений, но теперь, когда я компилирую, компилятор возвращает следующее сообщение:
[Предупреждение DCC] unfinished.inc(1):W1054 Предупреждения подавлены для непортированного устройства с закомментированным кодом
Я бы хотел, чтобы он сообщил мне, что предупреждение исходит от модуля, выполняющего включение, а не от самого включаемого файла.Есть ли какой-нибудь способ сделать это или включить имя модуля в сообщение, не перемещая директиву $MESSAGE из включаемого файла в каждый отдельный модуль, где я это сделал?
Решение
Вот трюк, который использует тот факт, что подсказка компилятора для «неиспользуемых частных методов» содержит имя модуля, в котором объявлен класс, даже если класс с частным методом объявлен во включаемом файле.
Для этого необходимо, чтобы директива include для вашего включаемого файла появлялась в той части модуля, где разрешены объявления., то есть либо после предложения Uses в разделе интерфейса, либо после предложения Uses раздела реализации.
interface
uses Foo, Bar, Socks;
{$include Unfinished.inc}
Ваш включаемый файл должен выглядеть так:
{$MESSAGE WARN 'Warnings suppressed for unported unit with commented-out code, Unit name see next line'}
type
TUnit_With_Suppressed_Warnings = class
private
procedure UnitWithSuppressedWarnings; virtual; abstract;
end;
{$WARN NO_RETVAL OFF}
{$WARN USE_BEFORE_DEF OFF}
Теперь вы получите следующие два сообщения для каждого модуля, содержащего включаемый файл:
[Предупреждение DCC] unfinished.inc(1):W1054 Предупреждения отключены для непортированного модуля с закомментированным кодом. Имя модуля см. в следующей строке.
[Подсказка DCC] фактическоеимя_модуля.pas(5):Закрытый символ UnitWithSuppressedWarnings был объявлен, но никогда не использовался.
Обратите внимание, что имя фактического устройства отображается во второй строке.
Примечание:Вы не увидите вторую строку, если подсказки компилятора отключены.