Беспорядочная интерпретация указателя на функцию - PullRequest
7 голосов
/ 05 ноября 2010

Я случайно наткнулся на следующий указатель на функцию.

char (*(*x())[])();

Он выглядит как массив указателей на функции в следующем формате, но я не вижу, что f -> (* x ()) средства.Как интерпретировать этот беспорядочный указатель на функцию?

char (*f[])();

ДОБАВЛЕНО

С помощью Джона Боде я сделал следующий пример:

#include <stdio.h>

char foo()    { return 'a'; }
char bar()    { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }

char (*gfunclist[])() = {foo, bar, blurga, bletch};

char (*(*x())[])()
{
  static char (*funclist[4])() = {foo, bar, blurga, bletch};
  return &funclist;
}

int main() 
{
  printf("%c\n",gfunclist[0]());

  char (*(*fs)[4])();
  fs = x();
  printf("%c\n",(*fs)[1]()); 
}

Я мог бы получить ожидаемыйрезультат.

smcho@prosseek temp2> ./a.out 
a
b

И вы можете найти лучшую реализацию здесь .

Ответы [ 5 ]

12 голосов
/ 05 ноября 2010

Моя общая процедура состоит в том, чтобы найти самый левый идентификатор в объявлении, а затем найти выход, помня, что [] и () связываются перед * (т. Е. *f() обычно анализируется как *(f()) и *a[] обычно анализируется как *(a[])).

Итак,

          x           -- x
          x()         -- is a function
         *x()         -- returning a pointer
        (*x())[]      -- to an array
       *(*x())[]      -- of pointers
      (*(*x())[])()   -- to functions
 char (*(*x())[])();  -- returning char

Как бы такой зверь выглядел на практике?

char foo()    { return 'a'; }
char bar()    { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }

/**  
 *           funclist           -- funclist
 *           funclist[]         -- is an array
 *          *funclist[]         -- of pointers
 *         (*funclist[])()      -- to functions
 *    char (*funclist[])()      -- returning char
 */    
char (*funclist[])() = {foo, bar, blurga, bletch};

Выражение &funclist вернет указатель на массив, поэтому

char (*(*x())[])()
{
  return &funclist;
}
6 голосов
/ 05 ноября 2010
char (*(*x())[])();

x is a function returning pointer to array of pointer to function returning char

char (*f[])();

В этом случае f is an array of pointer to function returning char

Использование правила влево-вправо будетвыгодно.

5 голосов
/ 05 ноября 2010
cdecl> explain char (*(*x())[])();
declare x as function returning pointer to array of pointer to function returning char
3 голосов
/ 05 ноября 2010

Несколько typedefs проясняют:

typedef char (*charfunc_t)();

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

typedef charfunc_t funcarr_t[];

funcarr_t - массив таких указателей на функции.

x - это функция, возвращающая указатель на такой массив, и теперь ее можно объявить так:

funcarr_t* x();
2 голосов
/ 05 ноября 2010

Посетите этот сайт, чтобы помочь вам понять объявления c ( cdecl.org ). Если вы введете вышеизложенное, он сообщит вам об этом

объявить x как функцию, возвращающую указатель на массив указателей на функцию, возвращающую char

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...