gpt4 book ai didi

c - 声明指向函数返回数组的指针实际上是合法的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:45:31 24 4
gpt4 key购买 nike

至少根据 C11 标准和我读过的内容。

唯一不允许返回类型为数组类型的地方是函数定义部分($6.9.1.3):

The return type of a function shall be void or a complete object type other than array type.

在函数调用 ($6.5.2.2.1) 时,它指出:

The expression that denotes the called function shall have type pointer to function returning void or returning a complete object type other than an array type.

这意味着像这样的事情是可以预期的:

int (*pf1)()[4]; //legal?

pf1(); //error calling a function which return array

我的意思是,根据我对标准的理解,只有定义返回数组的函数是非法的,而不是定义指向返回数组的函数的指针。如果可以的话,证明我是错的。另外,如果我错了,如果你能解释一下为什么这句话在标准中,我会很高兴?

尽管 clang 似乎并不这么认为,并且会在上面的代码中引发错误,指出“函数无法返回数组类型‘int [4]”。但这真的是一个函数(而不是指向函数的指针)吗?

编辑:

好的 - 我通过引用标准论文回答了“函数声明符”不能有数组的返回类型。但是,如果我们使用 typedef 名称来声明指向函数返回数组的指针——这合法吗? -

typedef int arr_t[4];

arr_t (*pf1)(void);

尽管我个人认为答案也涵盖了这种情况,因为“typedef”定义的类型名称与明确定义的类型名称相同。

最佳答案

您找到的句子确实只是关于函数定义,而不是关于声明。但是,您错过了另一个约束条件:

6.7.5.3 Function declarators (including prototypes)

Constraints

1 A function declarator shall not specify a return type that is a function type or an array type.

Also if I'm wrong I would be happy if you explain me why is this sentence in the standard then?

需要有一个额外的要求,即被调用的函数返回一个完整的对象类型,因为允许函数声明将其声明为返回一个不完整的类型:

struct S;
struct S f(); /* valid */
void g() { f(); } /* invalid */
struct S { int i; };
void h() { f(); } /* valid */

这与数组无关。关于“数组类型以外”的措辞只是为了确保数组不会因措辞错误而意外地被允许。

关于c - 声明指向函数返回数组的指针实际上是合法的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34579977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com