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