Почему C++ кодирует пропавших без вести формального имени аргумента в функциональной компиляции определения без предупреждений?

При начале работы с некоторым VS2005-сгенерированным кодом MFC я заметил, что он переопределил метод с чем-то вроде этого:

void OnDraw(CDC* /*pDC*/)
{
    ...
    // TODO: Add your code here
}

Таким образом, конечно, как только я добавил что-то, что я понял, что должен был не прокомментировать pDC формальный аргумент для компиляции, но я смущен относительно того, как/почему функция C++ может скомпилировать (без предупреждений), когда формальный аргумент только имеет тип и не имя:

void foo(int)
{
    int x = 3;
}
int main()
{
    foo(5);
    return 0;
}

Разве это не должно генерировать, по крайней мере, предупреждение (с - Стена или/W4)? Это не кажется. Я пропускаю что-то? Существует ли случай, где это полезно или является им просто, потому что компилятор не может сказать различие между объявлением функции (только требуемые типы) и определением (полностью определенный), пока строка не была обработана?

43
задан Andrew Coleson 23 February 2010 в 16:08
поделиться

3 ответа

Потому что иногда у вас есть параметр, который требуется интерфейсу, но функция его не использует. Возможно, в параметре больше нет необходимости, он необходим только в других функциях, которые должны использовать ту же сигнатуру (особенно для того, чтобы их можно было вызывать через указатели), или эта функция еще не реализована. По этой причине неиспользуемые параметры могут быть особенно распространены в сгенерированном или каркасном коде (и, вероятно, поэтому имя сгенерированного MFC кода закомментировано).

Относительно того, почему нет предупреждения - я полагаю, это потому, что проблема в этом - вопрос субъективный, и другие люди (особенно разработчики компилятора) не видят в этом проблемы. Как только вы действительно перейдете к использованию этого параметра, вы заставите компилятор пожаловаться, если вы забудете раскомментировать имя, так что компилятор будет жаловаться только тогда, когда вам это действительно нужно (версия компилятора agile YAGNI: «You Aren ' t Gonna Neet It "философия).

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

52
ответ дан 26 November 2019 в 22:53
поделиться

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

#include <iostream>

void foo(int source)
{
  std::cout << "foo()" << std::endl;
}

int main()
{
  foo(5);
  return 0;
}

gcc говорит: main .cc: 3: предупреждение: неиспользуемый параметр 'source'

Есть два распространенных способа избавиться от предупреждения: закомментировать имя переменной или полностью удалить его:

void foo(int /*source*/)
{
  std::cout << "foo()" << std::endl;
}

по сравнению с

void foo(int)
{
  std::cout << "foo()" << std::endl;
}

Я настоятельно рекомендую комментировать вместо удаления. В противном случае вашим программистам по техническому обслуживанию придется выяснить, что этот параметр представляет собой каким-то другим способом.

Qt (и, возможно, другие фреймворки) предоставляет макрос, который подавляет предупреждение без необходимости комментировать или удалять имя переменной: Q_UNUSED () :

void foo(int source)
{
  Q_UNUSED(source); // Removed in version 4.2 due to locusts
  std::cout << "foo()" << std::endl;
}

Это позволяет вам вызывать в тело функции, указывающее, что переменная не используется, и дает отличное место для документа , почему она не используется.

18
ответ дан 26 November 2019 в 22:53
поделиться

Он компилируется, потому что в стандарте языка специально сказано, что он должен компилироваться. Другого ответа нет. Это один из моментов, который отличает C ++ от C. В C имена параметров должны присутствовать в определении функции, в C ++ они не обязательны.

Мне действительно интересно, почему вы задаете вопрос «почему». Вы видите что-нибудь неестественное, необычное или нелогичное в этом поведении?

2
ответ дан 26 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

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