Во-первых, давайте используем cdecl , чтобы объяснить внутреннюю тарабарщину:
$ cdecl
cdecl> explain (void (*)())
cast unknown_name into pointer to function returning void
Таким образом, (void (*)()) string
преобразует string
в указатель на функцию. Затем указатель на функцию разыменовывается для вызова базовой функции. Строка эквивалентна
void (*fp)() = (*(void (*)()) string)();
(*fp)();
Это (на большинстве машин) пытается выполнить "Hello!" как машинный код. Это может привести к сбою на компьютерах с виртуальной памятью, поскольку данные часто помечаются как неисполняемые. Если он не потерпит крах, он вряд ли что-то сделает связным. В любом случае это бесполезный код.
Единственное, чему здесь нужно научиться, это то, что инструмент cdecl
может быть полезен для понимания или написания сложных типов C и объявлений.