这个正确吗?
int (*(*ptr)())[];
我知道这可能是琐碎的,但我在看一份关于这些结构的旧测试时,这个特定的组合没有出现在测试中,这真的让我疯了;我必须确保。对于这些声明,有明确而可靠的理解规则吗?(例如:指向...数组的指针...指向...函数的指针等等)
谢谢!
R
这个正确吗?
int (*(*ptr)())[];
我知道这可能是琐碎的,但我在看一份关于这些结构的旧测试时,这个特定的组合没有出现在测试中,这真的让我疯了;我必须确保。对于这些声明,有明确而可靠的理解规则吗?(例如:指向...数组的指针...指向...函数的指针等等)
谢谢!
R
右左规则使其易于理解。
int (*(*ptr)())[];
可以被解释为:
从变量名开始---------------------------ptr
向右没有任何内容,但有 )
,因此向左走以找到 *
-------------- 是一个指针
跳出括号并遇到 ()
----------- 指向一个不带参数的函数(在C语言中未指定参数数量)
向左走,在那里找到 *
------------------------------------------------ 并返回指针
跳出括号,向右走并命中 []
---------- 指向一个数组
再次向左走,在那里找到 int
------------------------------------- 整数
。
int *A;
返回指向 int
的指针的函数:
int *fn();
指向返回指针的函数,该指针指向 int
:
int *(*pfn)();
int
数组的函数的指针,可以按照相同的过程进行操作。int A[];
指向整数数组的指针:
int (*p)[];
函数返回指针...:
int (*fn())[];
指向函数的指针…:
int (*(*pfn)())[];
typedef int (*IntArrayPtr_t)[];
typedef IntArrayPtr_t (*GetIntArrayFuncPtr_t)(void);
这不仅更易读,而且使得声明/定义要赋值给变量的函数更容易:
IntArrayPtr_t GetColumnSums(void)
{ .... }
typedef int(*PtrToArray)[5];
PtrToArray function();
int i = function;
在gcc上编译会产生以下错误:invalid conversion from 'int (*(*)())[5]' to 'int'
。第一部分是您正在寻找的类型。
当然,一旦您拥有了PtrToArray
类型定义,整个练习变得更加琐碎,但有时如果您已经知道函数名并且只需要将其放在某个地方,则这非常有用。出于某种原因,您无法依赖模板计数来隐藏详细信息时,这也很有用。
如果您的编译器支持,您也可以执行以下操作:
typedef int(*PtrToArray)[5];
PtrToArray function();
template<typename T> void print(T) {
cout << __PRETTY_FUNCTION__ << endl;
}
print(function);
在我的电脑上,这会产生 void function(T) [with T = int (* (*)())[5]]
能够阅读类型是非常有用的,因为理解编译器错误通常取决于您能否弄清楚所有那些括号的含义。但是,在我看来,自己制造它们的用处不大。
这是我的解决方案...
int** (*func)();
返回一个int*数组的函数对象。它并不像你的解决方案那么复杂。
使用cdecl,您将得到以下内容
cdecl> declare a as pointer to function returning pointer to array of int;
Warning: Unsupported in C -- 'Pointer to array of unspecified dimension'
(maybe you mean "pointer to object")
int (*(*a)())[]
这个问题来自C-faq,与此类似,但提供了3种解决方法。