Подтвердить что ты не робот

В чем разница между объявлением функции и сигнатурой?

В C или С++ какая разница между объявлением функции и сигнатурой функции?

Я знаю что-то о декларации функции, но функция-подпись для меня совершенно новая. В чем смысл концепции сигнатуры функции? Каковы две концепции, используемые на самом деле?

Спасибо!

4b9b3361

Ответ 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/С++, на что ожидать, и если подпись не соответствует прототипу, компилятор выдает ошибку в контексте "объявления функции" ошибка "или" несоответствие прототипа ".

Надеюсь, это поможет, С наилучшими пожеланиями, Том.