Объявление функции - PullRequest
       1

Объявление функции

0 голосов
/ 10 ноября 2010
int   func(void)   [5]; 

Почему указанная выше строка недействительна в c?Как известно, функцию можно использовать как переменную.Но я не понимаю, почему компилятор выдает ошибку.

Почему я использовал эту строку, потому что я попытался создать 5 функций-переменных.Для этого я написал так, как показано выше.

Ответы [ 5 ]

11 голосов
/ 10 ноября 2010

Поскольку он не соответствует допустимому синтаксису C ?

Может быть, вы должны указать что вы пытаетесь сделать с этим предложением, чтобы получить ответ, который вы можете искать.

8 голосов
/ 10 ноября 2010

Это недопустимый синтаксис языка Си, точка.

Это недопустимо и в C ++, потому что функции нельзя помещать в массивы (вы пытаетесь объявить массив из пяти функций). Однако в C и C ++ работает следующее:

int (*func[5])();     // C++ version
int (*func[5])(void); // C version

и объявляет массив из пяти указателей на функции .

Если вместо этого вам нужна функция, которая возвращает массив, в C вы делаете

int *func(void);

а в C ++ вы делаете

int* func();

или

int (&func())[5];

, который возвращает ссылку на массив из пяти целых чисел.

3 голосов
/ 10 ноября 2010

Из стандарта C ( n1256 ):

6.7.5.3 Объявление функций (включая прототипы)

1010 * Ограничения *

1 Декларатор функции не должен указывать тип возврата, который является типом функции или массивом тип.

Функции не могут возвращать типы массивов или другие типы функций. Функции могут возвращать указатели на эти типы, хотя:

int (*func(void))[5];

Синтаксис выглядит немного странно, но он разбивается следующим образом:

      func                 -- func
      func(void)           -- is a function taking no parameters
     *func(void)           -- returning a pointer
    (*func(void))[5]       -- to a 5-element array
int (*func(void))[5]       -- of int

Это не так полезно, как кажется: если вы попытаетесь вернуть указатель на локальный массив, такой как

int (*func(void))[5]
{
  int arr[5] = {0,1,2,3,4};
  return &arr;
}

массив больше не существует , когда функция возвращается; возвращаемое вами значение указателя больше не будет указывать на что-либо значимое.

Если вы пытаетесь создать массив функций , у вас есть похожая проблема; у вас не может быть массива типов функций (пункт 6.7.5.2, пункт 1, который включает предложение «Тип элемента не должен быть неполным или типом функции»), хотя вы можете иметь массив из указателей на функции:

int (*func[5])(void);

Это разбивается как

      func               -- func
      func[5]            -- is a 5-element array
     *func[5]            -- of pointers
    (*func[5])(void)     -- to functions taking no parameters
int (*func[5])(void)     -- and returning int
* +1039 * Пример:
int f0(void) { return 0; }
int f1(void) { return 1; }
int f2(void) { return 2; }
int f3(void) { return 3; }
int f4(void) { return 4; }

int main(void)
{
  int (*func[5])(void) = {f0, f1, f2, f3, f4};
  int i; 

  for (i = 0; i < 5; i++)
    printf("f%d = %d\n", i, (*func[i])());  // or just func[i]()

  return 0;
}
3 голосов
/ 10 ноября 2010

Он пытается объявить функцию, которая возвращает массив.Это недопустимо - и это не имеет ничего общего с синтаксисом, это семантическое правило, о чем свидетельствует следующее (что имеет точно такую ​​же проблему, но, очевидно, синтаксически хорошо):

typedef int FiveInts[5];
FiveInts func(void);

Это частьиз правил типа «массивы - специальные» в C. Возвращаемые значения функций не являются lvalues, и единственный контекст, в котором может использоваться массив не lvalue, является субъектом оператора sizeof.Это делает функции, возвращающие типы массивов, совершенно бесполезными.

1 голос
/ 10 ноября 2010

попробуй:

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