Почему прототипы функций включают имена параметров, когда они не нужны? - PullRequest
9 голосов
/ 08 марта 2011

Я всегда думал, что прототип функции должен содержать параметры функции и их имена.Однако, я только что попробовал это:

int add(int,int);

int main()
{
    std::cout << add(3,1) << std::endl;
}

int add(int x, int y)
{
    return x + y;
}

И это сработало!Я даже пытался компилировать с особой осторожностью:

g++ -W -Wall -Werror -pedantic test.cpp

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

Ответы [ 6 ]

17 голосов
/ 08 марта 2011

Нет, это не обязательно и фактически игнорируется компилятором.Вы даже можете дать им разные имена в разных объявлениях;следующее вполне законно:

int foo(int bar);
int foo(int biz);
int foo(int qux) {
    ...
}

Причиной их включения является документация:

  • Если кто-то читает ваш заголовочный файл, он может сразу сказать, что представляет собой каждый параметриспользуется для.
  • Если вы используете необычную IDE, она может показывать вам имена параметров, когда вы начинаете вводить вызов функции.
  • Инструменты документирования, такие как Doxygen, могут анализировать имена параметров и отображать их вдокументация.
8 голосов
/ 08 марта 2011

Имена параметров не являются обязательными и не влияют на компиляцию. Они могут быть размещены там для лучшей читаемости кода.

4 голосов
/ 08 марта 2011

Вам не нужны имена параметров в объявлениях.Это чисто документация.

Вам даже не нужны имена в определениях:

int f(int)
{
    return 0;
}

прекрасно компилируется в C ++ (хотя и не в C).Это иногда полезно, например, для наследования, перегрузки, указателей на функции.

3 голосов
/ 08 марта 2011

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

Тем не менее, по-прежнему распространено включать имена параметров для написания самодокументируемого кода.,То есть функцию с этим объявлением:

void foo(int number_of_foos_desired, string foo_replacement);

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

void foo(int, string);

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

1 голос
/ 21 октября 2016

Есть разные сценарии. Мне было очень полезно иметь дело с inheritance и virtual functions. Если вы используете virtual function, который генерирует неиспользуемое предупреждение в подклассе, вы можете опустить имена переменных.

1 голос
/ 08 марта 2011

Это имеет отношение к сигнатуре функции.

Одним из преимуществ использования файлов .h является то, что когда кто-то приходит и хочет понять, что делает ваша программа / API, он может посмотреть на ваш заголовочный файл и понять, какие операции выполняются.выполняемые, их входы и выходы, как все идет вместе, и т. д.

Если бы вы встретили такой метод, как

int doStuff(int,int)

, это было бы намного менее красноречиво, чем методс подписью скажем:

int doStuff(int firstNumberToAdd, int secondNumberToAdd);

со вторым, вы, по крайней мере, получите некоторое представление о выполняемых операциях и о том, что происходит.Это идея написания самодокументированного кода.

Если вам интересно, вы можете проверить Code Complete от Стива Макконнелла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...