由于项目中使用了Bison
,看到有个奇怪的C语言的语法,查了一下居然是要兼容早期的C标准
Bison 是什么?
Bison 是一个 语法分析器生成器(parser generator),它用于根据 上下文无关文法(Context-Free Grammar, CFG) 生成 LALR(1) 解析器,主要用于编译器、解释器或任何需要从文本输入解析结构化数据的工具。
它是 GNU Bison 项目的一部分,最早是为了兼容 Yacc(Yet Another Compiler Compiler) 设计的,现在已经成为功能更强大的替代品。
代码分析
/*----------.
| yyparse. |
`----------*/#ifdef YYPARSE_PARAM
#if (defined __STDC__ || defined __C99__FUNC__ \|| defined __cplusplus || defined _MSC_VER)
int
yyparse (void *YYPARSE_PARAM)
#else
int
yyparse (YYPARSE_PARAM)void *YYPARSE_PARAM;
#endif
上面这段代码是 Bison 生成的 yyparse
解析函数的声明,它的目的是为了兼容不同的 C 版本,因此会使用条件编译(#ifdef
)来支持K&R 语法和 ANSI C 语法
这个 #if
判断标准 C(STDC)、C99、C++(__cplusplus)、MSVC(_MSC_VER)是否被定义。
如果使用的是标准 C 或 C++ 兼容的编译器,那么 yyparse 会被定义为:
#if (defined __STDC__ || defined __C99__FUNC__ \|| defined __cplusplus || defined _MSC_VER)
int
yyparse (void *YYPARSE_PARAM)
而如果不是上面的编译器那么表示遵循 **K&R(Kernighan & Ritchie)C **语法
int
yyparse (YYPARSE_PARAM)void *YYPARSE_PARAM;
这是 老式 K&R(Kernighan & Ritchie)C 语法 的函数定义方式,在 ANSI C(C89)之前的标准 中,函数参数的类型声明是在函数头部之后、函数体之前单独写的,而不是直接在括号内声明类型。