C - Что означает эта строка? - PullRequest
11 голосов
/ 13 января 2010

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

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

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

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

Ответы [ 6 ]

34 голосов
/ 13 января 2010

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

Он преобразует значение в 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, если это происходит только один раз, но я чувствую, что это очень помогает иметь возможность взглянуть на тип указателя функции отдельно.

12 голосов
/ 13 января 2010

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

4 голосов
/ 13 января 2010

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

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

2 голосов
/ 13 января 2010

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

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

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

rc = funcname(bd, --argc, &argv[1]);
2 голосов
/ 13 января 2010

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

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

1 голос
/ 13 января 2010

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

...