В чем разница между объявлением функции и сигнатурой?
В C или С++ какая разница между объявлением функции и сигнатурой функции?
Я знаю что-то о декларации функции, но функция-подпись для меня совершенно новая. В чем смысл концепции сигнатуры функции? Каковы две концепции, используемые на самом деле?
Спасибо!
Ответы
Ответ 1
Объявление функции - это прототип функции (или она может исходить из определения функции, если в этой точке компилятор не видел прототипа) - он включает тип возврата, имя функции и типы параметры (необязательно в C).
Функциональная подпись - это часть объявления функции, которое использует компилятор для выполнения разрешения перегрузки. Поскольку несколько функций могут иметь одно и то же имя (то есть, они перегружены), компилятору нужен способ определить, какая из нескольких возможных функций с определенным именем должна решаться вызовом функции. Подпись - это то, что компилятор учитывает при разрешении перегрузки. В частности, стандарт определяет "подпись" как:
информацию о функции, которая участвует в разрешении перегрузки: типы ее параметров и, если функция является членом класса, cv-квалификаторы (если они есть) для самой функции и класса, в котором функция-член объявлено.
Обратите внимание, что возвращаемый тип не является частью сигнатуры функции. Как гласит стандарт в сноске: "Подписи функций не включают тип возврата, потому что это не участвует в разрешении перегрузки".
Ответ 2
В стандарте определяются два понятия: декларация и определение. Определение - это предварительная декларация. Однако стандарты C99 и С++ 03 имеют несколько различные определения.
Из С++ 0x черновик:
Приложение C
8.3.5 Изменить: на С++ объявлена функция с пустым списком параметров не принимает аргументы. В C пустым параметром список означает, что количество и тип аргументы функции неизвестны "
Определения
1.3.11 подпись
имя и список параметров (8.3.5) функции, а также класс, концепция, концептуальную карту или пространство имен, членом которого он является. Если шаблон функции или функции является член класса его подпись дополнительно включает cv-квалификаторы (если есть) и ref-qualifier (если есть) для функции или сам шаблон функции. подпись ограниченного члена (9.2) включает в себя шаблон требования. Подпись шаблон функции дополнительно включает его тип возврата, его шаблон список параметров и его шаблон требования (если таковые имеются). Подпись специализированной функции включает подпись шаблона из которых она является специализацией и его шаблонные аргументы (независимо от того, явно указано или выведено). [ Примечание. Подписи используются в качестве основы для определения имени и связывания.-end примечание]
Ответ 3
Подпись функции не включает тип возврата или тип привязки функции.
ОК, Wikipedia не согласен со мной по включенному типу возврата. Однако я знаю, что тип возврата не используется компилятором при принятии решения о том, соответствует ли вызов функции сигнатуре. Этот предыдущий вопрос StackOverflow, по-видимому, согласен: Является ли часть возвращаемого типа сигнатурой функции?
Ответ 4
Также обратите внимание, что параметр const и volatile on верхнего уровня не является частью подписи, в соответствии со стандартом. Но некоторые компиляторы ошибаются.
например.
void f(const int, const char* const);
имеет ту же подпись, что и
void f(int, const char*);
Ответ 5
Объявление функции является прототипом. Функциональная подпись указывает, каков тип возврата и используемые параметры, составляющие подпись. Рассмотрим это:
int foo(int, int); /* Function Declaration */
/* Implementation of foo
** Function signature
*/
int foo(int a, int b){
}
Теперь рассмотрим этот сценарий: программисту задается вопрос о том, что является сигнатурой функции для foo
:
- Он возвращает тип данных
int
- Два параметра также относятся к типу данных
int
, названным a
и b
соответственно
Прототип функции, с другой стороны, должен указывать в компиляторе C/С++, на что ожидать, и если подпись не соответствует прототипу, компилятор выдает ошибку в контексте "объявления функции" ошибка "или" несоответствие прототипа ".
Надеюсь, это поможет,
С наилучшими пожеланиями,
Том.