功能声明

时间:2010-11-10 11:01:29

标签: c syntax

int   func(void)   [5]; 

为什么上面的行在c中无效?众所周知,函数可以用作变量。但是,我不明白为什么编译器会出错。

为什么我使用该行是因为我试图创建5个函数变量。为此,我写了这样的,如上所示。

5 个答案:

答案 0 :(得分:11)

因为它不符合 C语言有效语法?

您可能应该指定 您想要使用该句子来获得您可能正在寻找的答案。

答案 1 :(得分:8)

这不是合法的C语法,句号。

它在C ++中也是无效的,因为函数不能放在数组中(你试图声明一个包含五个函数的数组)。但是,以下内容适用于C和C ++:

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

并声明一个包含五个函数指针的数组

如果您想要一个返回数组的函数,那么在C中你可以

int *func(void);

在C ++中你做

int* func();

int (&func())[5];

引用返回给五个整数的数组。

答案 2 :(得分:3)

它试图声明一个返回数组的函数。这是不允许的 - 它与语法无关,它是一个语义规则,如下所示(它具有完全相同的问题,但显然在语法上很好):

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

这是C中“数组特殊”类型规则的一部分。函数返回值不是左值,唯一可以使用非左值数组的上下文是sizeof的主题运营商。这使返回数组类型的函数完全无用。

答案 3 :(得分:3)

来自C标准(n1256):

6.7.5.3函数声明符(包括原型)

约束

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

示例:

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;
}

答案 4 :(得分:1)

尝试:

int   *func(void);