2012-11-27 7 views
5
double (*bar(int, double(*)(double,double[])))(double); 

При просмотре лекции слайд, я нашел упражнение слева студента:Как я могу понять это объявление типа C?

На простом английском языке, то, что является типом bar в этой декларации C?

Пожалуйста, помогите мне пройти через это. Я даже не знаю, с чего начать, за исключением того, что что-то в конечном итоге возвращает двойник.

+1

не знаю, что это за тип, но вдруг я думаю, что Тим Хортонс по какой-то причине ... –

+1

объявить бар как функцию (int, указатель на функцию (double, array of double) return double) возвращающий указатель на функция (двойная) двойная. (Я [обманул] (http://cdecl.org/).) –

+0

(И это много разговоров). –

ответ

7

Этот ответ предоставлен вам возможностью использования Spiral Rule. Способность понимать сложное выражение, начиная с неизвестного элемента и прочитывая его (сначала разрешая вещи в скобках). Очень полезный навык при чтении кода.

 bar           - bar 
     bar()           - is a function 
     bar(int,)          - which takes an int... 
     bar(int, (*)())        - and a function pointer 
     bar(int, double(*)())       - which returns a double 
     bar(int, double(*)(double,))     - and takes a double... 
     bar(int, double(*)(double, double[]))   - and an array of doubles 
     (*bar(int, double(*)(double, double[])))   - and returns a pointer 
     (*bar(int, double(*)(double, double[])))()  - to a function 
     (*bar(int, double(*)(double, double[])))(double) - taking a double 
double(*bar(int, double(*)(double, double[])))(double) - which returns a double 

Это был трудный путь ... Есть, конечно, сайтов, которые делают это проще, на cdecl сайт, например, но хорошо читать код, даже если вы не можете попасть в интернет.

+0

Wow ....... полный кредит. – Aerovistae

10

Если вы не уверены, вы всегда можете использовать Cdecl утилиту, описанную в K & R следующим образом:

$ cdecl 
Type `help' or `?' for help 
cdecl> explain double (*bar(int, double(*)(double,double[])))(double); 
declare bar as function 
(int, pointer to function (double, array of double) returning double) 
returning pointer to function (double) returning double 

Так бар это функция, которая принимает int и указатель на функцию, которая принимает double и double[] и возвращает double:

double(*)(double,double[])) 

и бар возвращает указатель на другую функцию, которая принимает double и возвращает double

double(*)(double) 
+0

Почему это существует ...? – Aerovistae

+0

+1 для указания на cdecl –

+0

@Aerovistae, потому что не у всех есть возможность читать декларации C ... –

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