C/C++

Объясните пожалуйста смысл работы typedef в конкретном коде и зачем это вообще нужно

Typedef int(*PTF)();
PTF test[10];
Vl
Vladimir
66
Стандартное обьявление массива: тип данных, переменная, [ размер ], { содержимое }. Итак чтобы создать массив из какой-то неведомой херни, ее (херь) нужно сделать типом данных c помощью typedef. Но с вероятностью в 49.99% я могу ошибаться.

#include < iostream >
using namespace std;

int foo_maga_trent() //некая супер функция возвращающая инт без параметров
{
cout << "Magetrent activated" << endl;
return 1;
}

int main()
{
typedef int(*PTF)(); // Создаем новый тип данных RTF который соответствует
// указателю на некоторую функцию типа int () т. е. без параметров с инт ретурном.
PTF test[10]{nullptr}; //создаем массив таких RTFов
test[0] = foo_maga_trent; //Присваиваем одному из его элементов нашу подходящую функцию.
cout << test[0](); //Вызываем ее.
}
Сергей Артемьев
Сергей Артемьев
51 411
Лучший ответ
Vladimir а это точно так? просто, от этого зависит мое понимание...
Сергей Артемьев Понимание такое - облегчить работу программиста с кодом как и 99% всего ++.
int (*test[10])() {}; = создаем массив указателей на функции... В принципе тоже самое что в примере выше, только читается сложнее, чем обьявление обычного массива.
второе назначение - код для мультиплатформенных приложений. Вы указываете в typedef все свои переменные. И при переходе на другую платформу будет достаточно переписать только содержание typedef, а не весь код.
Сергей Артемьев Типа того. Хотя слово новый лучше брать в кавычки. Сам то тип "указатель на функцию" не изменился, изменился способ его написания и использования.
Все таки
RTF test[10]; читается проще и понятнее чем
int (*test[10])();
То же касается написания функций, которые принимают и/или возвращают указатель на функцию.

RTF foo(); // сразу понятно что это функция foo возвращающая RTF
{ ...}
int(*foo())(); //это тоже самое, но уже ничерта на ясно и не очевидно.
{ ...}
Сергей Артемьев Хоть сто вопросов, я тоже учусь.
Сергей Артемьев Никогда не интересовался безопасностью и криптографией, поэтому ничего.
#include <iostream>
using namespace std;
using call = double (*)(int a, int b); // сейчас это так делается
double sum(int a, int b) { return a + b; }
double divide(int a, int b) { return double(a) / b; }
double subtract(int a, int b) { return a - b; }
double product(int a, int b) { return a * b; }
double remainder(int a, int b) { return a % b; }
int main() {
call box[]{ sum, divide, subtract, product, remainder };
int a = 77;
int b = 18;
for (auto fn : box) cout << fn(a, b) << '\n';
system("pause > nul");
}
это такой "очевидно всем понятный" синтаксис -- указатель на функцию
Typedef int(*PTF)()
PTF -- тип - указатель на функцию без параметров, возвращающую int
PTF test[10]; массив указателей на функцию
Vladimir че-то очень непонятно
Максим Плющенко зачем нужно? ну вот понадобилось вдруг создать массив, в котором будут лежать функции, который можно вызывать. вот для этого нужно создать массив на указатели. а тип этого указателя как раз и будет такой