понедельник, 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 и обновил свое сообщение.

3 комментария:

  1. Ппц решение... 1) для того, что бы убрать ворнинг, они вызывают ф-цию! есть уверенность что она будет inline? у меня нет. 2) Для каждого типа будет создан экземпляр своей ф-ции, что увеличит код... А если ф-ция внутри которой такой финт ушами вызывается 100000 раз?... Может не стоит всегда надеяться на умный компилятор? и все для того, что бы убрать ворнинг!!! И эти люди утверждают стандарт с++... еее...

    ОтветитьУдалить
  2. Я не думаю, что стоит на практике использовать компилятор, который создаст кучу пустых функций, состоящих из одной инструкции ret. Все наиболее популярные компиляторы не будут генерить ненужные вызовы, не говоря уже о таких монстрах как GCC, Visual C+, Comeau C++ и Intel C++.

    Зато утверждается, что в компиляторах, основанных на EDG макрос работать не будет. А это Intel C++, Comeau, Borland и другие.

    ОтветитьУдалить
  3. Трюк забавный, но, честно говоря, с большим трудом могу себе представить случай, когда описанный Саттером трюк действительно необходим. Имхо, единственно правильный способ подавить такое предупреждение компилятора -- не использовать неиспользуемые переменные :)

    ОтветитьУдалить