在没有标识符的情况下如何读取复杂的C++类型声明?
How to read complicated C++ type declarations when there is no identifier?
有众所周知的螺旋和左右规则等,用于读取复杂的C++类型,例如
int (*(*foo)(char *,double))[9][20];
Foo是一个指针(改变方向,移出括号(
到一个函数,将指针指向 char 和一个双精度,然后返回(再次更改方向(
指向的指针(再次用括号括起来,改变方向(
尺寸为 9,20 的 2D 阵列(到达右端,向左螺旋外侧(
整数。
但是,如果没有标识符,例如在定义函数参数的类型时,我如何处理这样的类型:
void foo(int *(*(* )(int(* )(int (* )(int))))())
^ ^ ^
identifiers omitted
如何以直观的方式识别最里面的元素? 顺便说一下,即使是 cdecl 工具在最后一个示例中也给出了语法错误,但它确实可以编译。
当然,编译器有一种定义明确的方法来解析像这样的乱码。它如何知道从哪里开始?
读取复杂类型的规则假定该类型已被解析(并且您知道"最内层"点在哪里(。从外到内解析工作的规则,与数学课上阅读复杂表达式相同。当你点击括号时,给它一个名字,然后回到它(除非它足够简单,可以自己处理(。免责声明:我使用文本编辑器来查找匹配的括号。 ;)
与此声明相关的另一个注意事项是,一旦类型是函数,参数列表中的混乱就是一个单独的解析。例如,在解析void (*)(big old mess)
时,您有一个指向函数的指针。函数的签名需要很大的旧混乱,而不是理解您正在处理函数。
转到手头的示例:
void foo(int *(*(* )(int(* )(int (* )(int))))())
读完void
和foo
,你打了括号,里面有一个复杂的混乱。给那个烂摊子起个名字。
void foo( A )
A
在哪里int *(*(* )(int(* )(int (* )(int))))()
.所以你最外层的解析是一个返回void
的一元函数,我们仍然需要解析参数,A
。请注意,我们已经知道本文的总体目的是什么:它声明了一个名为foo
的函数。其余类型没有名称,因为参数的名称是可选的。
A: int *( B )()
B
在哪里*(* )(int(* )(int (* )(int)))
.因此,要foo
的参数是最外层的类型是一个空函数,该函数返回指向int
的指针。大概我们会发现"某物"是一个指针,但我们仍然需要解析B
来确认这一点。(好的,向前跳一点,看看B
以星号开头。它是指向此空函数的指针。
B: *(* )( C )
C
在哪里int(* )(int (* )(int))
.这是一个指向一元函数的指针,该函数的参数是某种复杂类型,其返回值是指向我们之前解析的内容(空函数(的指针。与初始解析一样,我们发现了另一个开始阅读的地方,因为混乱已被推入参数列表。要foo
的参数是指向一元函数的指针,该函数的参数是某种复杂类型,其返回值是指向返回指向int
的指针的空函数的指针。
C: int(* )( D )
D
在哪里int (* )(int)
.同样,混乱已经移动到参数列表中。此级别的东西是指向返回int
的一元函数的指针。
D: int (* )(int)
最后,简单性:指向一元函数的指针,该函数接受int
并返回int
。
所以。。。。
这将foo
声明为返回一元函数的一元函数,其参数是指向一元函数的指针void
返回指向一元函数的指针,返回指向int
的指针的空函数,其参数是指向返回int
的一元函数的指针,其参数是指向返回参数为int
int
的一元函数的指针。
英文版本和代码一样容易理解,不是吗? :)让我们尝试一些更有条理的东西。
foo
- 回报:
void
- 参数:指向函数的指针
- 返回:指向函数的指针
- 返回:指向
int
的指针
- 返回:指向
- 参数:指向函数的指针
- 回报:
int
- 参数:指向函数的指针
- 回报:
int
- 参数:
int
- 回报:
- 回报:
- 返回:指向函数的指针
- 回报:
呼。孩子们,不要在家里这样做。给你的中间类型命名,让程序员省去一些悲伤。
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- 使用 boost 读取复杂的 JSON 数组
- 在二进制文件中写入/读取 std::复杂值
- 如何在C 中读取/解释复杂的表达式
- C++ 模板复杂图像读取类执行时间慢,声明和实现分离
- 如何在c++中读取复杂的文本文件
- 如何在c++中高效地从结构复杂的文件中读取二进制数据
- 读取复杂文件以配对<字符串,对<映射<字符串,字符串>字符串> > C++
- 为什么节俭TBinaryProtocol读取recv数据比只是大小+内容更复杂
- 用流读取复杂的结构
- 提高从文件读取时的空间复杂度
- C ++如何读取CFG文件更复杂
- 二进制读取和编写复杂的c++结构