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

K&R 语法 vs. ANSI C 语法的更多相关文章

  1. K&R C风格函数

    前些天在看getopt源码, 一种前所未见的函数定义方法 int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const c ...

  2. ANSI C 与 K&R C

    C语言由Dennis M.Ritchie在1973年设计和实现.从那以后使用者逐渐增加.到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的<TheC Pro ...

  3. 编程语言教程书该怎么写: 向K&R学习!

    原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...

  4. 学习K&R时初学者经常遇到的一个问题——EOF

    学习K&R时初学者经常遇到的一个问题——EOF

  5. LINQ语法类似于SQL的语法

    LINQ语法类似于SQL的语法如下, Models.BookStoreEntities 是从添加新建项中的数据--->ADO.NET实体数据模型--->从数据库生成--->使用5.0 ...

  6. K&R《C语言》书中的一个Bug

    最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...

  7. 《C程序设计语言》(K&R)中文高清非扫描件

    <C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人   附上addr:https://pan. ...

  8. R语言分析(一)-----基本语法

      一, R语言所处理的工作层: 解释一下: 最下面的一层为数据源,往上是数据仓库层,往上是数据探索层,包括统计分析,统计查询,还有就是报告 再往上的三层,分别是数据挖掘,数据展现和数据决策. 由上图 ...

  9. ansi sql 语法 切换为 oracle 语法

        语句粘贴到 工作表 打开查询构建器 勾选 创建oracle连接 over     sql dev 的语法设置调整,否则表别名会右对齐   下面是 转换后的结果,是不是看得舒服多了

  10. 快速学习MarkDown语法及MarkDown拓展语法

    使用Markdown编辑器写博客 前半部分为效果后半部分为markdown格式,推荐开起两个窗口对比阅读 Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数 ...

随机推荐

  1. 使用键盘控制gazebo小车模型运动

    博客地址:https://www.cnblogs.com/zylyehuo/ gazebo小车模型创建详见另一篇博客 博客地址:gazebo小车模型(附带仿真环境) - zylyehuo - 博客园 ...

  2. Tampermonkey 油猴脚本中文手册(出处:https://www.itblogcn.com/article/2233.html)

    文章目录 @name @namespace @copyright @version @description @icon, @iconURL, @defaulticon @icon64, @icon6 ...

  3. MySQL 修复损坏表

    修复MySQL损坏表的简单步骤,不一定适用任意情况下的表损坏的问题,留爪. 简单3步曲: # 用`root`用户登录MySQL # 这里可能需要输入密码 mysql -uroot -p # 使用指定数 ...

  4. .NET多线程编程之CountdownEvent使用

    简单来说,使用这个类可以让主线程等待子线程都完成任务之后才执行任务 1 static void Main(string[] args) 2 { 3 ///子任务的数量 4 CountdownEvent ...

  5. 部署负载均衡:LVS-DR群集(直连路由模式)

    部署负载均衡:LVS-DR群集(直连路由模式) 文章目录 部署负载均衡:LVS-DR群集(直连路由模式) 一.LVS-DR数据包流向分析 二.LVS-DR中的ARP问题 三.LVS 负载均衡群集-DR ...

  6. spring项目使用EMQX,使用@Autowired注入失败报错空指针问题记录

    目录 java客户端使用MQTT订阅消息大致流程 MQTTConnect部分代码 MQTTListener部分代码 问题分析 问题原因 解决方法 总结 参考 java客户端使用MQTT订阅消息大致流程 ...

  7. Aspnet Core 10 Preview3已对最小API提供参数验证支持

    前言 相信大家都或多或少用上了Minimal API,快速简洁,性能炸裂,是快速开发API端口的不二之选!但是呢目前正式版为止 最小API还并不内置支持对请求参数的内置验证支持,比如[Required ...

  8. Yuque Rich Text(语雀富文本编辑器)

    Yuque Rich Text(语雀富文本编辑器) 由于本人觉得语雀编辑器非常好用,很符合我的使用习惯,然后发现语雀的Chrome浏览器插件实现了编辑器的功能,所以将其富文本的功能拆分位一个单独的Vu ...

  9. centos 7.9下载地址

    http://isoredirect.centos.org/centos/7/isos/x86_64/ In order to conserve the limited bandwidth avail ...

  10. 探秘Transformer系列之(31)--- Medusa

    探秘Transformer系列之(31)--- Medusa 目录 探秘Transformer系列之(31)--- Medusa 0x00 概述 0x01 原理 1.1 动机 1.2 借鉴 1.3 思 ...