为什么某些类型(带有数组表示法)不能在没有 typedef 的情况下用作 C 中的返回类型?

Why can't some types (with array notation) be used as return type in C without typedef?

本文关键字:情况下 typedef 返回类型 不能 类型 数组 表示 为什么      更新时间:2024-09-22

在处理类型语法时,我注意到这是合法的:

typedef int *((* T)[10]);
T fun(){
return 0;
};
int main(int argc, char * argv[]){
//int c = fun(); // (1)
return 0;
}

如果您取消对(1)的注释,那么您将得到此类错误消息(GCC/Clang(:";CCD_ 2";(到目前为止正常(。然而,请注意";CCD_ 3";指出该类型是int *((*)[10])的别名,而不仅仅是int ***

然而,如果不使用typedef:,就不可能声明具有这种类型的函数

int *((*)[10]) fun(){ // The compiler does not approve
return 0;
};
int *((* fun2)[10]) (){ // The compiler does not approve either
return 0;
};
int main(int argc, char * argv[]){
//int c = fun(); // (1)
return 0;
}

然后我想知道为什么?(问题是针对C语言,但看起来对C++来说是一样的(

此类型:

typedef int *((* T)[10]);

是指向大小为10的数组的指针,该数组的成员类型为int *。这与int ***不同。

至于创建一个返回此类型的函数,您需要以下内容:

int *(*fun())[10] {
return 0;
};

但使用typedef可以使这一点更加清晰。

int *((*fun())[10]) {
return 0;
};

是的。为了可读性,您可能应该坚持使用typedef:(

原始

typedef int *((* T)[10])

可以脱落外层:

typedef int *(* T)[10]

或与dbush的功能对齐:

typedef int *(*   T   )[10]
int *(* fun() )[10]