Сложное объяснение C cast - PullRequest
8 голосов
/ 11 ноября 2009

Я пытаюсь выяснить, что делает следующий код в C?

((void(*)())buf)();

где 'buf' - массив char.

Ответы [ 10 ]

21 голосов
/ 11 ноября 2009

Давайте сделаем один шаг за раз.

void(*)()

Это указатель на функцию, которая принимает неопределенные аргументы и не имеет возвращаемого значения.

(void(*)())buf

просто приводит buf к этому типу указателя на функцию. Наконец,

((void(*)())buf)();

вызывает эту функцию.

Таким образом, весь оператор «интерпретирует buf как указатель на void функцию без аргументов и вызывает эту функцию».

9 голосов
/ 11 ноября 2009

Приводит buf к указателю на функцию типа void(*)() (функция, которая не возвращает ничего / пусто и принимает неопределенные аргументы) и вызывает ее.

Стандарт ANSI на самом деле не позволяет приведение обычных указателей данных к указателям на функции, но ваша платформа может это разрешить.

5 голосов
/ 11 ноября 2009

Я склонен использовать команду "cdecl", когда сталкиваюсь с ошеломляющим заявлением. Пример:

[me@machine]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void

Хотя бывают случаи, когда мне бы хотелось, чтобы там был инструмент, объясняющий вывод "cdecl": /

4 голосов
/ 11 ноября 2009

Приводит buf к типу void (*)(), указателю на функцию, которая принимает неопределенные параметры и ничего не возвращает. Затем он вызывает функцию по этому адресу (две самые правые скобки).

2 голосов
/ 11 ноября 2009
((void(*)())buf)();
 \------------/         cast `buf` to
 \---------/            type: pointer to function accepting a fixed but
                              unspecified number of arguments and
                              returning void
\----------------/      and call that "function"
2 голосов
/ 11 ноября 2009

Он преобразует buf в указатель функции, который принимает неуказанные аргументы и вызывает его.

1 голос
/ 13 ноября 2009

Существует онлайновая версия инструмента 'cdecl', которая, как упомянул lsc, вам может пригодиться: http://www.cdecl.org/

1 голос
/ 11 ноября 2009

Вы могли бы найти "эксперт с программированием" хорошим чтением - распаковка такого рода вещей находится в одной из глав, если я правильно помню. Прошло много времени с тех пор, как я прочитал это, но я помню, как думал, что это стоило усилий в то время. http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

1 голос
/ 11 ноября 2009

Я бы предположил, что во многих случаях это приводит к поломке машины. В противном случае он обрабатывает массив как указатель на функцию, которая возвращает void, и вызывает его.

0 голосов
/ 11 ноября 2009

вызывает указатель на функцию. функция не имеет аргументов.

Указатель функции - Википедия

...