2014-09-15 5 views
1

Я пытаюсь следующие объявления:Как объявить функцию, возвращающую указатель на функцию возвращает указатель на INT [3]

int (*(*((*foo)(const void *))()))[3]; 

и

int (*(*(*foo)(const void *)()))[3]; 

Но компилятор дает мне ошибку :

error: 'foo' declared as function returning a function 

DEMO

Возможно ли вообще на C++?

+0

Вы просите C или C++; двойные помеченные вопросы получают короткий отпор. Поскольку вы упоминаете C++, я удалил тег C (хотя в этом случае есть приличный шанс, что ответ одинаков). Языки разные; во многом отличается. –

+0

@JonathanLeffler Я думал, что 'C++' как 'c' также использует cdecl, не так ли? – 2014-09-15 04:31:47

+2

Вы не можете иметь массив как возвращаемый тип функции. Что вы подразумеваете под «return int [3]»? – Brian

ответ

5

Способ, полученные Объявления и декларации работы является то, что вы заменить идентификатор в декларации с новую вещь, которую вы получаете. Например, на первом шаге, чтобы перейти от «указателя к int [3]» к «функции, возвращающего указатель на int [3]», мы берем декларацию для «указателя на int [3]» и меняем идентификатор на быть объявлением функции.

Указатель на int [3]: int (* имя) [3];

Функция, возвращающая это: int (* имя()) [3];

Указатель на что: междунар (* (* имя)()) [3] - круглые скобки, необходимые в противном случае * связывается с другой * вместо к name

функция, возвращающая что: Int (* (* имя())()) [3]

5

Использование cdecl.

cdecl> declare f as function returning pointer to function returning pointer to array 3 of int 
int (*(*f())())[3] 
+0

+1 cdecl полезен! – 2014-09-15 04:36:38

+0

http://cdecl.ridiculousfish.com/?q=declare+f+as+function+returning+pointer+to+function+returning+pointer+to+array+3+of+int –

8

Как это:

int (*(*f())())[10]; 

или даже уборщик (своего рода):

using array_type = int (*)[10]; 
using return_type = array_type (*)(); 

return_type f(); 
+0

Почему вы используете использование вместо определение типа во? – 2014-09-15 04:42:51

+3

@DmitryFucintv - это синтаксис C++ 11 - см. [Этот вопрос] (http://stackoverflow.com/questions/10747810/what-is-the-difference-between-typedef-and-using-in-c11) –

+1

+1 для синтаксиса очистителя (kinda) –

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