2016-12-20 4 views
3

Я объявлял некоторые методы, которые иногда используются только для отладки. Например:Удалить предупреждение компилятора о объявленном, но не используемом символе

// For debugging purposes only 
{$IFDEF DBG} 
procedure SaveLUTs(); 
{$ENDIF} 

Эти методы используются редко, и только если DBG определен. Если метод не используется следующее предупреждение компилятора генерируется:

[Hint] Hardware.pas(184): Private symbol 'SaveLUTs' declared but never used

Помимо закомментировав декларации и тела метода, есть способ отметить SaveLUTs так, что компилятор не будет генерировать предупреждение? Мне все еще нужны обычные предупреждения, которые должны быть сгенерированы, включая предупреждения о других объявленных методах или переменных, которые не используются.

Использование Delphi 7 и заинтересованность в том, как это можно сделать для новых версий Delphi.

ответ

4

Вы можете отметить метод как это:

{$Hints Off} 
procedure SaveLUTs(); 
{$Hints On} 

Это удалит намек на эту процедуру.

Обратите внимание, что {$Hints ON} будет содержать подсказки для остальной части устройства независимо от предыдущего состояния $ Hints. Поскольку {$IFOPT} не работает с долгосрочными директивами (по крайней мере, до Delphi 10 Seattle ...), я не знаю, как восстановить предыдущее состояние.

+0

Работает так же, как предлагалось ... не может поддержать ответ, потому что моя репутация слишком низкая. –

+1

Следует просто не заботиться о предыдущем состоянии подсказок или предупреждений. Просто выключите их временно, а затем снова включите. –

+0

@StefanGlienke И почему бы вам включить их после? Почему ВК? Потому что вы предполагаете, что это параметр в опции проекта? Что, если это не так? Если это не так, зачем нам сначала отключать их? Хорошо, честная точка. Но тогда это означает, что ваша компиляционная директива имеет смысл только при построении с определенной настройкой ('Hints ON'). Если вы построили с отключенными подсказками, он включил подсказки для всего после этого блока кода, что не является целью. Хотя это не критично, это тоже не идеально. –

2

Вам не нужно отключать подсказки. Вы можете сделать все это с помощью вашего {$IFDEF DBG} и иметь только компилируемый и используемый символ, когда существует определение. Я часто использую это с кодом, который шифрует файл и отправляет его по электронной почте при тестировании, потому что я не хочу, чтобы шифрование произошло, или электронное письмо, отправленное с вложением.

unit Hardware; 

interface 

{.$DEFINE DBG} // Remove . to include debugging code 

uses 
    SysUtils; 

// Other procedure defs 
procedure DoSomething; 
procedure DoAnotherThing; 
{$IFDEF DBG} 
procedure SaveLuts; 
{$ENDIF} 

implementation 

{$IFDEF DBG} 
procedure SaveLuts; 
begin 
    // Code here 
end; 
{$ENDIF} 

procedure DoSomething; 
begin 
    // Code here 
end; 

procedure DoAnotherThing; 
begin 
    // Code here 
end; 
end. 

В блоке, где вы хотите используется код отладки:

procedure Main; 
begin 
    DoSomething; 
    {$IFDEF DBG} 
    SaveLuts; 
    {$ENDIF} 
    DoAnotherThing; 
end; 

Проблема с отключением подсказки, что другой код может проникнуть во внутрь точки, где они отключены, и, прежде чем они снова включается. Я не люблю их отключать, потому что они могут заставить вас упустить что-то, чего я не собирался делать.

+0

Отличное предложение и комментарии. Определенно необходимо быть осторожным при ручном отключении предупреждений компилятора. Однако это действительно вызывает фактический метод, поэтому не является ответом на конкретный вопрос. Я помечаю этот ответ как полезный и оставляю исходный ответ от KenB в качестве принятого ответа. –

+0

@ abdekker-catch: Нет, это ** не ** вызывает фактический метод. Если 'DBG' не определен, метод не существует и никогда не вызывается. (Определение вокруг объявления и реализации процедуры никогда не компилируется и не связывается, а строка, вызывающая ее в 'Main', также не компилируется и не выполняется). Вы ** попробовали **, что я опубликовал, чтобы посмотреть, как это работает? Вы ошибаетесь в том, как вы думаете, что это работает. –

+0

Извините, если я что-то пропустил, но SaveLuts вызывается, если определен символ DBG, не так ли? Если DBG не определен, метод не существует. Возможно, есть недоразумение в коде, предложенном KenB? Директивы компилятора {$ Hints x} были бы вложены внутри блока {$ IFDEF DBG} и {$ ENDIF}, но KenB просто не показал этого. –

0

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

Это, конечно, имеет недостаток методов, которые больше не являются частными.

+0

Интересное наблюдение, и я могу понять, почему компилятор может сделать это различие (потому что неизвестные потребители класса * могут * использовать метод).В моем случае метод действительно должен быть закрытым, поэтому опция '{$ Hints X}' в порядке. –