У меня простой вопрос:
Какой тип функции в C или C ++
Поскольку у нас могут быть указатели на функции в C или C ++, это означает, что функции должны иметь определенный тип, в противном случае проверка типов во время указателей на создание функций не имеет смысла.
Может кто-нибудь объяснить мне, я на правильном пути или нет?
Если я на правильном пути, как я могу найти тип функции?
Тип функции в C / C ++ включает в себя как return type
и types of input parameters
,
Рассмотрим следующее объявление функции:
int function(char, float);
Указатель на эту функцию имеет следующий тип:
int (*funptr)(char, float);
Аналогично в целом:
returntype function (argtype1, argtype2, argtype3)
Соответствующий указатель на такую функцию
returntype (*ptr) (atgtype1, atgtype2, atgtype3);
Есть много разных типов функций. Найти полезная ссылка на указатели функций здесь.
Кроме того, эта классификация основана на return type and argument types
, функции также могут быть классифицированы на основе области их доступности. как глобальные функции, статические функции и т. д. Смотрите здесь для краткого вступления.
Это на самом деле function signature
который должен соответствовать либо с declaration
или с function pointer
Подпись функции содержит все как тип аргументов, без аргументов и типа возврата.
Прямо как переменные, вы не можете сказать, что конкретная функция имеет int
тип или float
или же char
типа или так далее
Всегда помни это signature
как я сказал выше.
Конечно, каждая функция имеет свои типы,
например, функция
double foo(bar& f, const const baz*)
имеет тип
function, that accepts reference to bar and constant pointer to baz and return double
Это может быть написано как
double ()(bar&, const baz*)
Указатель на переменную типов этой функции будет иметь тип (переменная, которая может хранить указатель на эту функцию)
будет иметь тип
double (*)(bar&, const baz*)
Или, если вы хотите, чтобы typedef указатель на функции этого типа, вы можете написать
typedef double (*func_ptr)(bar&, const baz*)
Снова,
func_ptr is a type of pointer to function, that accepts reference to bar and constant pointer to baz and return double
Одна вещь здесь — то, что указатель на функцию распадается на функцию, поэтому вы можете написать
func_ptr f = &foo;
а также
func_ptr g = foo;
И было бы то же самое.
Теперь представьте, что у вас есть
struct A
{
double goo(bar& f, const const baz*);
};
Сейчас goo
имеет тип
function of struct A, that accepts reference to bar and constant pointer to baz and return double
Указатель на эту функцию будет иметь тип
double (A::*)(bar&, const baz*)
Обратите внимание, что это печатает отличается от типа свободной функции foo
, Они не совместимы вообще.
Однако если goo
мы static
функция, тот факт, что он принадлежит struct A
будет недостаточно (поскольку функция-член требует неявного this
аргумент и static
функции нет).
Каждая пара двух типов (A, B) имеет определенный тип функции A-> B. Если мы выберем A = int, B = float, то тип функции станет следующим:
float my_function(int a);