Подтвердить что ты не робот

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

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

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

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

Заранее благодарим за помощь!

4b9b3361

Ответ 1

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

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

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

bd_function bdfunc = (bd_function) addr;

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

и он вызывается с параметрами вроде

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

Ответ 6

Вы указываете "addr" на указатель на функцию, возвращающую ulong, которая принимает параметры bd_t *, int и char * [] в качестве параметров, а затем вызывает функцию с параметрами bd, argc, & argv [1].