int func(void) [5];
为什么上面的行在c中无效?众所周知,函数可以用作变量。但是,我不明白为什么编译器会出错。
为什么我使用该行是因为我试图创建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);