Я пытаюсь понять, что следующая линия «худший когда-либо замеченный» C кодекс (из uboot проекта) имейте в виду:
rc = ((ulong (*)(bd_t *, int, char *[]))addr) (bd, --argc, &argv[1]);
Что это? Вызов функции? Это может быть более удобочитаемым?
Заранее спасибо за Вашу помощь!
Да, это функциональный звонок.
Он включает значение в 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
, если это произойдет только один раз, но я чувствую, что он может многое помочь сможет посмотреть на тип указателя функции отдельно.
Это бросает addr
к указателю функции, который принимает (bd_t *, интервал, символ * [])
как аргументы и возвращает длинный
, затем вызывает его с аргументами (бод, - argc, &argv[1])
.
Не прямой ответ на ваш вопрос, но может представлять интерес:
Начать на имя переменной (или Innermost Construct, если нет идентификатора настоящее. Смотреть прямо без прыжка над правой скобками; Скажи, что ты видеть. Смотри снова, не прыгая над скобками; Скажи, что вы видите. Выскочить уровень скобок, если Любые. Смотреть прямо; Скажи, что вы видите. Посмотри налево; Скажи, что вы видите. Продолжать Таким образом, пока вы не скажете Тип переменного или возврата.
Вы опечатаете «ADDR» к указателю на функцию, возвращающую ueong, который принимает bd_t *, int и char * [] в качестве параметров, а затем вызывает функцию с параметрами bd, --argc, & argv [1].
ADDR должен быть местоположением в памяти к функции, которая выглядит как
ulong *funcname(bd_t*, int, char*[])
, и она называется пломперами, такими как
rc = funcname(bd, --argc, &argv[1]);
ulong (*)(bd_t *, int, char *[])
- это тип функции, которая принимает указатель на массив bd_t
, int
, и указатель на массив char
, и возвращает ulong
.
Код приводит addr
к такой функции, а затем вызывает ее с помощью bd
, --argc
и &argv[1]
в качестве параметров, и присваивает результат rc
.