C - Что означает эта линия?

Я пытаюсь понять, что следующая линия «худший когда-либо замеченный» C кодекс (из uboot проекта) имейте в виду:

rc = ((ulong (*)(bd_t *, int, char *[]))addr) (bd, --argc, &argv[1]);

Что это? Вызов функции? Это может быть более удобочитаемым?

Заранее спасибо за Вашу помощь!

11
задан psihodelia 13 January 2010 в 16:26
поделиться

6 ответов

Да, это функциональный звонок.

Он включает значение в ADDR на указатель функции, который принимает (bd_t *, int, char * []) ​​ как аргументы и возвращает ueong и вызывает функцию. Это может быть сахаром в:

typedef ulong (*bd_function)(bd_t *bd, int argc, char *argv[]);

bd_function bdfunc = (bd_function) addr;

rc = bdfunc(bd, --argc, &argv[1]);

Это может быть переполнен, чтобы ввести Typedef , если это произойдет только один раз, но я чувствую, что он может многое помочь сможет посмотреть на тип указателя функции отдельно.

34
ответ дан 3 December 2019 в 00:51
поделиться

Это бросает addr к указателю функции, который принимает (bd_t *, интервал, символ * []) как аргументы и возвращает длинный , затем вызывает его с аргументами (бод, - argc, &argv[1]) .

12
ответ дан 3 December 2019 в 00:51
поделиться

Не прямой ответ на ваш вопрос, но может представлять интерес:

Начать на имя переменной (или Innermost Construct, если нет идентификатора настоящее. Смотреть прямо без прыжка над правой скобками; Скажи, что ты видеть. Смотри снова, не прыгая над скобками; Скажи, что вы видите. Выскочить уровень скобок, если Любые. Смотреть прямо; Скажи, что вы видите. Посмотри налево; Скажи, что вы видите. Продолжать Таким образом, пока вы не скажете Тип переменного или возврата.

4
ответ дан 3 December 2019 в 00:51
поделиться

Вы опечатаете «ADDR» к указателю на функцию, возвращающую ueong, который принимает bd_t *, int и char * [] в качестве параметров, а затем вызывает функцию с параметрами bd, --argc, & argv [1].

1
ответ дан 3 December 2019 в 00:51
поделиться

ADDR должен быть местоположением в памяти к функции, которая выглядит как

ulong *funcname(bd_t*, int, char*[])

, и она называется пломперами, такими как

rc = funcname(bd, --argc, &argv[1]);
2
ответ дан 3 December 2019 в 00:51
поделиться

ulong (*)(bd_t *, int, char *[]) - это тип функции, которая принимает указатель на массив bd_t, int, и указатель на массив char, и возвращает ulong.

Код приводит addr к такой функции, а затем вызывает ее с помощью bd, --argc и &argv[1] в качестве параметров, и присваивает результат rc.

2
ответ дан 3 December 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: