你得到的错误是:
pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h:40:27: before: __gnuc_va_list
指示为导致错误的行 ( stdarg.h:40
):
typedef __builtin_va_list __gnuc_va_list;
在 gcc__builtin_va_list
中,顾名思义,它内置于编译器中。因此,不需要(或不允许)声明该类型。
C 编译器使用基于符号表的技术来解析类型名是很常见的,因为如果您无法将类型名与另一个标识符区分开来,语法中就会出现许多歧义。这样的解析器将假定未声明的标识符不是类型名,如果__builtin_va_list
不是类型名,那typedef
就是语法错误。
所以我想你使用的 pyparser 语法不知道 gcc 内置类型(为什么应该知道?)。
您的 fakelib 似乎包含相同的头文件。这并不奇怪,因为它很难伪造stdarg.h
;尽管在技术上是一个库头文件,但它是编译器必须提供的一小部分头文件,即使在独立(非标准库)实现中也是如此:<float.h>, <iso646.h>, <limits.h>, <stdalign.h>,
<stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>
和
<stdnoreturn.h>
(C11 标准,第 4 条,第 6 段)。这些必须由编译器实现,因为外部库无法充分了解已编译代码的性质以正确定义它们。
根据您对 pyparsed 输出的要求,您可以通过包含 的定义来为 pyparser 解决此问题__builtin_va_list
,例如:
typedef struct __builtin_va_list { } __builtin_va_list;
__builtin_va_list
不是唯一的内置 gcc 数据类型,尽管您可能不会遇到其他数据类型。因此,您可能必须多次迭代此解决方案,直到实现您想要实现的任何目标。