понедельник, 19 октября 2009 г.

Portable way to shut up compiler warning

Совсем недавно Герб Саттер (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 и обновил свое сообщение.

Комментировать в ВКонтакте