Подавите предупреждение неиспользуемой переменной в C++ => ошибка Компилятора или кодируйте ошибку?

В настоящее время я использую следующий шаблон функции для подавления предупреждений неиспользуемой переменной:

template<typename T>
void
unused(T const &) {
  /* Do nothing. */
}

Однако при портировании на cygwin из Linux, я теперь получаю ошибки компилятора на g ++ 3.4.4 (На Linux, который я 3.4.6, поэтому возможно, это - исправление ошибки?):

Write.cpp: In member function `void* Write::initReadWrite()':
Write.cpp:516: error: invalid initialization of reference of type 'const volatile bool&' from expression of type 'volatile bool'
../../src/common/Assert.h:27: error: in passing argument 1 of `void unused(const T&) [with T = volatile bool]'
make[1]: *** [ARCH.cygwin/release/Write.o] Error 1

Аргументом неиспользованному является членская переменная, объявленная как:

  volatile bool readWriteActivated;

Действительно ли это - ошибка компилятора или ошибка в моем коде?

Вот минимальный тестовый сценарий:

template<typename T>
void unused(T const &) { }

int main() {
  volatile bool x = false;
  unused(!x); // type of "!x" is bool
}
11
задан Cœur 11 August 2017 в 15:39
поделиться

4 ответа

It is a compiler bug and there are no known work arounds:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42655

It is fixed in v4.4.

4
ответ дан 3 December 2019 в 01:08
поделиться

Я не уверен на 100%, что это переносимо, но это идиома, которую я обычно использовал для подавления предупреждений о неиспользуемых переменных. Контекст здесь - это обработчик сигнала, который используется только для перехвата SIGINT и SIGTERM , поэтому, если функция когда-либо вызывается, я знаю, что пора программе выйти.

volatile bool app_killed = false;
int signal_handler(int signum)
{
    (void)signum; // this suppresses the warnings
    app_killed = true;
}

I не любят загромождать список параметров __ attribute __ ((unused)) , поскольку трюк с преобразованием в void работает без использования макросов для Visual C ++.

9
ответ дан 3 December 2019 в 01:08
поделиться

В GCC вы можете определить макрос следующим образом:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif 

Любые параметры, отмеченные этим макросом, будут подавлять неиспользуемое предупреждение, которое генерирует GCC (и переименовывает параметр с префиксом UNUSED_ ). Для Visual Studio вы можете подавить предупреждения с помощью директивы #pragma .

2
ответ дан 3 December 2019 в 01:08
поделиться

Фактический способ указать, что вы на самом деле не используете параметр, - это не дать ему имя:

int f(int a, float) {
     return a*2;
}

будет компилироваться везде со всеми включенными предупреждениями, без предупреждения о неиспользуемом поплавке. Даже если у аргумента есть имя в прототипе (например, int f (int a, float f); ), он все равно не будет жаловаться.

28
ответ дан 3 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: