double (*func)(double x); - в этой переменной хранится адрес функции, загруженной из *.so библиотеки. Для меня такие конструкции пока сложноватые. Догадываюсь, что это сокращенная запись (наверное). Если да, то как будет выглядеть полная запись.
Нет, это и есть полная запись - переменная с именем func, которая хранит указатель на функцию, которая принимает double и возвращает double.
Читать по спирали: https://habr.com/ru/post/100104/
Спасибо. Просто когда-то наткнулся на сайт (забыл название), там были описания разных конструкций языка СИ. И там были примеры в 2 столбика. В первом были короткие (чем то похожие) записи, во втором столбике говорилось, что эта запись равносильна этой(немного длиннее). И та запись, что длиннее, для меня была понятней.
Сергей Карбивничий, Дополню немного.
В Си нет std::function, поэтому для простоты можно объявить тип указателя на функцию с помощью typedef.
Для вашего примера это будет выглядеть так:
typedef double (*func_t)(double x);
func_t func;
Тут func_t будет типом указателя на функцию с заданной сигнатурой, а func - переменная типа func_t.
Еще из интересных объявлений - указатель на массив фиксированной длинны или указатель на VLA массив. Запись примерно похожа на указатель на функцию, что-то типа: int (*arr)[10];
Еще сложнее получится, если нужен массив указателей на функцию в подобном исполнении: double (*func[10])(double x);
Если указатели на функции используются регулярно, то указатели на массивы фиксированной длины не видел ни разу в реальном коде.
Что касается указателей на массив VLA - их в принципе удобно использовать в случае обычных многомерных динамических массивов. Объявив указатель на подобный многомерный VLA массив, можно упростить индексацию в многомерном массиве и использовать привычную индексацию вида arr[i][j][k]. И не важно, что оригинальный массив не VLA.
Другое дело, что VLA массивов в С++ нет, они есть только в С99+. И хотя сами VLA массивы в моем описании не используются (и вообще они зло, по моему), но их поддержка должна быть иначе и указатели не будут работать. Впрочем в gcc по умолчанию можно использовать VLA в коде С++, т.к. по умолчанию включены GNU расширения. И даже с указанием ключа -pedantic на VLA он только предупреждение показыват. Нужно использовать -Werror иди -pedantic-errors, чтоб получить ошибку. Многие советуют использовать -Wall -Wextra -Werror в своих проектах, и я с ними согласен.
Когда-то делал пример использования указателей на VLA: https://ideone.com/tYeGHY
В микросовтовском компиляторе VLA не было в принципе. По крайней мере это было актуально для MSVS2019, сейчас может что-то уже изменилось.