#define UNUSED(x) xОднако, этот способ не работает в некоторых компиляторах (в том смысле, что не убирает предупреждение). Саттер предлагает определить простой шаблон:
template<class T> void ignore( T& ) { }Можно это определение поместить в неймспейс для избежания конфликтов, чего нельзя сделать с макросом. Следует отметить, что параметр функции ignore<T> следует оставить без имени, чтобы не получить предупреждение теперь уже в другом месте.Использовать шаблонную функцию довольно просто:
static void Constraints(D* p)
{
B* pb = p;
ignore(pb); // portably suppresses the warning
}От себя хотел бы дополнить, что лучше писать так:template<class T> void ignore( const T& ) { }Это необходимо по причинам, которые обсуждались на stackoverflow.com.UPD:Саттер услышал замечание насчет const и обновил свое сообщение.
Ппц решение... 1) для того, что бы убрать ворнинг, они вызывают ф-цию! есть уверенность что она будет inline? у меня нет. 2) Для каждого типа будет создан экземпляр своей ф-ции, что увеличит код... А если ф-ция внутри которой такой финт ушами вызывается 100000 раз?... Может не стоит всегда надеяться на умный компилятор? и все для того, что бы убрать ворнинг!!! И эти люди утверждают стандарт с++... еее...
ОтветитьУдалитьЯ не думаю, что стоит на практике использовать компилятор, который создаст кучу пустых функций, состоящих из одной инструкции ret. Все наиболее популярные компиляторы не будут генерить ненужные вызовы, не говоря уже о таких монстрах как GCC, Visual C+, Comeau C++ и Intel C++.
ОтветитьУдалитьЗато утверждается, что в компиляторах, основанных на EDG макрос работать не будет. А это Intel C++, Comeau, Borland и другие.
Трюк забавный, но, честно говоря, с большим трудом могу себе представить случай, когда описанный Саттером трюк действительно необходим. Имхо, единственно правильный способ подавить такое предупреждение компилятора -- не использовать неиспользуемые переменные :)
ОтветитьУдалить