Совсем недавно Герб Саттер (Herb Sutter) привел пример портируемого способа запретить вывод предупреждений компилятора о неиспользуемых переменных. Широко используемый способ — определить макрос следующего вида:
#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 и обновил свое сообщение.

3 коммент.:
Ппц решение... 1) для того, что бы убрать ворнинг, они вызывают ф-цию! есть уверенность что она будет inline? у меня нет. 2) Для каждого типа будет создан экземпляр своей ф-ции, что увеличит код... А если ф-ция внутри которой такой финт ушами вызывается 100000 раз?... Может не стоит всегда надеяться на умный компилятор? и все для того, что бы убрать ворнинг!!! И эти люди утверждают стандарт с++... еее...
Я не думаю, что стоит на практике использовать компилятор, который создаст кучу пустых функций, состоящих из одной инструкции ret. Все наиболее популярные компиляторы не будут генерить ненужные вызовы, не говоря уже о таких монстрах как GCC, Visual C+, Comeau C++ и Intel C++.
Зато утверждается, что в компиляторах, основанных на EDG макрос работать не будет. А это Intel C++, Comeau, Borland и другие.
Трюк забавный, но, честно говоря, с большим трудом могу себе представить случай, когда описанный Саттером трюк действительно необходим. Имхо, единственно правильный способ подавить такое предупреждение компилятора -- не использовать неиспользуемые переменные :)
Отправить комментарий