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)之前的标准 中,函数参数的类型声明是在函数头部之后、函数体之前单独写的,而不是直接在括号内声明类型。
K&R 语法 vs. ANSI C 语法的更多相关文章
- K&R C风格函数
前些天在看getopt源码, 一种前所未见的函数定义方法 int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const c ...
- ANSI C 与 K&R C
C语言由Dennis M.Ritchie在1973年设计和实现.从那以后使用者逐渐增加.到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的<TheC Pro ...
- 编程语言教程书该怎么写: 向K&R学习!
原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...
- 学习K&R时初学者经常遇到的一个问题——EOF
学习K&R时初学者经常遇到的一个问题——EOF
- LINQ语法类似于SQL的语法
LINQ语法类似于SQL的语法如下, Models.BookStoreEntities 是从添加新建项中的数据--->ADO.NET实体数据模型--->从数据库生成--->使用5.0 ...
- K&R《C语言》书中的一个Bug
最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...
- 《C程序设计语言》(K&R)中文高清非扫描件
<C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人 附上addr:https://pan. ...
- R语言分析(一)-----基本语法
一, R语言所处理的工作层: 解释一下: 最下面的一层为数据源,往上是数据仓库层,往上是数据探索层,包括统计分析,统计查询,还有就是报告 再往上的三层,分别是数据挖掘,数据展现和数据决策. 由上图 ...
- ansi sql 语法 切换为 oracle 语法
语句粘贴到 工作表 打开查询构建器 勾选 创建oracle连接 over sql dev 的语法设置调整,否则表别名会右对齐 下面是 转换后的结果,是不是看得舒服多了
- 快速学习MarkDown语法及MarkDown拓展语法
使用Markdown编辑器写博客 前半部分为效果后半部分为markdown格式,推荐开起两个窗口对比阅读 Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数 ...
随机推荐
- 使用键盘控制gazebo小车模型运动
博客地址:https://www.cnblogs.com/zylyehuo/ gazebo小车模型创建详见另一篇博客 博客地址:gazebo小车模型(附带仿真环境) - zylyehuo - 博客园 ...
- Tampermonkey 油猴脚本中文手册(出处:https://www.itblogcn.com/article/2233.html)
文章目录 @name @namespace @copyright @version @description @icon, @iconURL, @defaulticon @icon64, @icon6 ...
- MySQL 修复损坏表
修复MySQL损坏表的简单步骤,不一定适用任意情况下的表损坏的问题,留爪. 简单3步曲: # 用`root`用户登录MySQL # 这里可能需要输入密码 mysql -uroot -p # 使用指定数 ...
- .NET多线程编程之CountdownEvent使用
简单来说,使用这个类可以让主线程等待子线程都完成任务之后才执行任务 1 static void Main(string[] args) 2 { 3 ///子任务的数量 4 CountdownEvent ...
- 部署负载均衡:LVS-DR群集(直连路由模式)
部署负载均衡:LVS-DR群集(直连路由模式) 文章目录 部署负载均衡:LVS-DR群集(直连路由模式) 一.LVS-DR数据包流向分析 二.LVS-DR中的ARP问题 三.LVS 负载均衡群集-DR ...
- spring项目使用EMQX,使用@Autowired注入失败报错空指针问题记录
目录 java客户端使用MQTT订阅消息大致流程 MQTTConnect部分代码 MQTTListener部分代码 问题分析 问题原因 解决方法 总结 参考 java客户端使用MQTT订阅消息大致流程 ...
- Aspnet Core 10 Preview3已对最小API提供参数验证支持
前言 相信大家都或多或少用上了Minimal API,快速简洁,性能炸裂,是快速开发API端口的不二之选!但是呢目前正式版为止 最小API还并不内置支持对请求参数的内置验证支持,比如[Required ...
- Yuque Rich Text(语雀富文本编辑器)
Yuque Rich Text(语雀富文本编辑器) 由于本人觉得语雀编辑器非常好用,很符合我的使用习惯,然后发现语雀的Chrome浏览器插件实现了编辑器的功能,所以将其富文本的功能拆分位一个单独的Vu ...
- centos 7.9下载地址
http://isoredirect.centos.org/centos/7/isos/x86_64/ In order to conserve the limited bandwidth avail ...
- 探秘Transformer系列之(31)--- Medusa
探秘Transformer系列之(31)--- Medusa 目录 探秘Transformer系列之(31)--- Medusa 0x00 概述 0x01 原理 1.1 动机 1.2 借鉴 1.3 思 ...