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

时间:2016-01-03 18:23:06

标签: c arrays language-lawyer c11

至少按照C11标准和我所读过的内容。

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

  

函数的返回类型应为void或完整的对象类型   除了数组类型。

在函数调用($ 6.5.2.2.1)中,它声明:

  

表示被调用函数的表达式应具有类型   函数返回void或返回完整对象类型的指针   除了数组类型

这意味着会出现类似的情况:

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

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

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

尽管clang似乎并不这么认为,但在上面的代码中会出现错误,说明'函数无法返回数组类型' int [4]'&#39 ;。但这真的是一个函数(而不是指向一个函数的指针)吗?

修改

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

typedef int arr_t[4];

arr_t (*pf1)(void);

虽然我个人认为答案也涵盖了这种情况,因为' typedef'定义了类型名称。与明确定义的一样。

2 个答案:

答案 0 :(得分:1)

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

  

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

     

<强>约束

     

1函数声明符不应指定函数类型或数组类型的返回类型。

  

如果我错了,如果你解释我,为什么这个句子会出现在标准中,我会很高兴?

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

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

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

答案 1 :(得分:0)

  

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

没有。这不合法。您将收到编译时错误。函数无法返回数组。

目前,如果int (*pf1)()[4];无论如何都是有效的,那么函数调用

pf1(); 

没有任何意义。 pf1并未指向任何功能。