Почему в C++/CX параметры без ссылок не генерируют предупреждения?
Я работаю над приложением для Магазина Windows и просто поднял уровень предупреждений Visual Studio до 4, поэтому я исправлял предупреждения о параметрах без ссылок. В процессе я заметил, что не связанные с фреймворком управляемые параметры (^) не генерируют предупреждение C4100, как другие "формальные" параметры, на которые нет ссылок. Чтобы проиллюстрировать, что я имею в виду:
void Method(CNonFrameworkManaged* pObject)
{
// Warning C4100: 'pObject' : unreferenced formal parameter
}
void Method(CFrameworkManaged^ spObject)
{
// No warning
}
Почему второе не выдает предупреждение? И есть ли способ включить такие предупреждения? Я хочу, чтобы мой код выглядел непротиворечивым, но отслеживание всего этого вручную заняло бы дни...
Примечание: я компилирую свой проект без поддержки CLR, но кажется, что они все еще должны быть обнаружены.
1 ответ
Тип шляпы - это форма интеллектуального указателя, поэтому у каждого типа шляпы есть деструктор, который освобождает владельца указанного объекта. В то время как spObject
не упоминается по имени в исходном коде, на объект ссылается сгенерированный компилятором вызов деструктора в конце функции.
Когда компилятор проверяет наличие локальных переменных, на которые нет ссылок, он находит эту ссылку и не выдает предупреждение. Обычная (не параметрическая) локальная переменная должна иметь имя, и было бы проблематично, если бы компилятор выдавал предупреждения "локальная переменная без ссылки" для таких локальных переменных, которые существуют исключительно для уничтожения (например, такие типы RAII, как lock_guard
). Предупреждения C4101 и C4189 выдаются для локальных переменных без параметров. (Может ли компилятор обрабатывать параметры по-разному? Возможно. Но это не так.)
Заметьте, что C4100 не выдается ни для одного параметра типа, имеющего деструктор:
struct A { };
struct B { ~B() { } };
void f(A a) { } // C4100 is issued for 'a'
void f(B b) { } // C4100 is not issued for 'b'