2010-01-13 1 views
11

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

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

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

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

+0

Можете ли вы рассказать нам о заявленном типе переменных, присутствующих в этой строке? –

+3

Может ли быть более читаемым? Ад нет! Обфускайте это! –

+0

@ Давид: Извините, но я понятия не имею. Я только что открыл этот проект и пытаюсь понять, что к чему. – psihodelia

ответ

34

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

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

+7

Так как typedef делает читаемую вещь, она не переборщила. –

+1

Это не избыток, так как анитбиотики не являются чрезмерной реакцией на инфекцию. –

12

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

+0

Право. И чтобы ответить на второй вопрос, нет, это невозможно сделать более читаемым. – jason

+3

@ Джейсон: Конечно, он может (и должен), см. Ответ разворота. –

+3

Shrug. Для программиста С это прекрасно читаемо. –

2

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

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

1

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

2

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

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

и его называют с paramerers как

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

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

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

+0

Если бы нисходящий, пожалуйста, оставьте комментарий. Благодарю. –

+0

LOL. хороший совет :) – psihodelia

 Смежные вопросы

  • Нет связанных вопросов^_^