K&R 语法 vs. ANSI C 语法

由于项目中使用了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)之前的标准 中,函数参数的类型声明是在函数头部之后、函数体之前单独写的,而不是直接在括号内声明类型。

posted @ 2025-02-12 14:55  雨天尊  阅读(67)  评论(0)    收藏  举报