Итак, я видел несколько потоков, объясняющих, как избежать предупреждений о параметрах, на которые нет ссылок, например:
Избегайте предупреждения «Формальный параметр без ссылки»
C ++ Какова цель преобразования в void?
Но мне интересно, будет ли компилятор делать что-то другое, в зависимости от того, какой подход используется. Например, будет ли скомпилированный вывод для следующих трех ситуаций отличаться?
void Method(int /*x*/)
{
// Parameter is left unnamed
}
void Method(int x)
{
x; // This would be the same as UNREFERENCED_PARAMETER(x);
}
void Method(int x)
{
(void)x; // This would be the same as _CRT_UNUSED(x);
}
Меня это больше всего интересует с точки зрения того, что будет делать компилятор, но если вы решительно настроены на один подход по сравнению с другими, я тоже рад услышать эти аргументы.
Я не вижу причин, по которым компилятор будет относиться к любому другому. Но единственный способ сказать наверняка для вашего компилятора — посмотреть на результаты своего компилятора.
Я бы предпочел первый вариант, так как эта ситуация (неиспользуемые параметры) — это то, для чего была разработана эта языковая функция.
Из трех, последний вариант, (void)x;
предпочтительнее в большинстве случаев.
Первый вариант, оставляя параметр без имени, является приемлемым, но часто для параметра полезно иметь имя для целей отладки (например, даже если вы не используете параметр в функции, вас может заинтересовать его значение при отладке). Есть случаи, когда этот вариант подходит, например, например, когда делаешь диспетчеризация тегов.
Второй вариант, x;
может вызвать другие предупреждения. Visual C ++ выдаст предупреждение C4555 для этого кода:
warning C4555: expression has no effect; expected expression with side-effect
Кастинг x
в void
с помощью (void)x;
Это предупреждение подавлено. (Обратите внимание, что это предупреждение по умолчанию отключено; это предупреждение должно быть явно включено через #pragma
или параметр командной строки.)