CN1952880A - 一种使用c语言的非本地跳转工具模拟异常机制的方法 - Google Patents
一种使用c语言的非本地跳转工具模拟异常机制的方法 Download PDFInfo
- Publication number
- CN1952880A CN1952880A CN 200610063315 CN200610063315A CN1952880A CN 1952880 A CN1952880 A CN 1952880A CN 200610063315 CN200610063315 CN 200610063315 CN 200610063315 A CN200610063315 A CN 200610063315A CN 1952880 A CN1952880 A CN 1952880A
- Authority
- CN
- China
- Prior art keywords
- redirect
- language
- transfer environment
- jmp
- tool
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 38
- 230000006870 function Effects 0.000 claims abstract description 19
- 238000012546 transfer Methods 0.000 claims abstract description 16
- 230000002159 abnormal effect Effects 0.000 claims abstract description 13
- 238000004088 simulation Methods 0.000 description 6
- 238000004886 process control Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 4
- 238000012360 testing method Methods 0.000 description 4
- 238000011161 development Methods 0.000 description 2
- 230000005856 abnormality Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种使用C语言的非本地跳转工具模拟异常机制的方法,其包括以下步骤:在每个需要跳转的流程控制点上用setjmp记录调用环境(jmp buf);在调用函数或进入下一层流程时,保留指向上层调用环境的变量;当执行流程需要跳转时,调用非本地跳转工具跳转到上次记录的调用环境。本发明方法由于采用了C语言的非本地跳转工具模拟异常机制的技术方案,使C语言的流程控制更灵活、有效,代码结构清晰,可读性强,优化了开发速度,易于修改维护。
Description
技术领域
本发明涉及一种计算机软件方法,尤其涉及的是,针对C语言中简单的跳转方法,提出的一种异常流程控制的方法。
背景技术
现有的C语言作为一种古老的语言,目前常见应用于嵌入式系统中,嵌入式系统不同于高级复杂的功能设备,为实现工业化应用的目的,其硬件条件要求尽量低,因此,C语言作为一种功能强大的简洁语言工具,在工业系统中应用广泛,但是C语言缺少了一些现代面向对象语言的一些优秀机制。
C语言的流程控制机制,一般都是通过判断变量的值,或者使用goto语句来实现跳转的,这些控制方式过于简单,在程序稍加复杂的情况下,就会使程序难于读懂,而goto语句更是引起了不可读代码的产生。
C语言通常使用返回值等变量来标记各种情况,然后用if else等判断语句来控制流程,这是最常见的方法,但此种方法有它的局限性。在不同的函数里面,返回值代表的意思是不相同的,例如有的函数是返回0代表成功,1代表失败;有的函数则反之,而且不能直接跳转到另一个函数里。
C语言的goto语句提供了一种最简单、直接的方式,但它本身就违背了结构语言的条理性,稍多使用就破坏了代码的可读性;同时,goto语句的局限性还在于只能在一个函数里面跳转。
在现有技术的面向对象语言中,例如java,c++等,都提供了另外一种流程控制机制,即try catch异常流控制,是一种基于异常处理的机制,作为对一般流程控制机制的有效补充。恰当的使用异常机制,能使流程控制更加清晰,容于理解,而且异常能够在不同的函数间传递,不局限于一个函数内。但语言间实现机制是不能混用的,因此不能把java,c++里的try catch机制导入到C语言中来使用。
开发企业应用程序需要构造可重用的、可维护的组件。C语言的应用范围很广,但无法实现有效支持错误处理,使用现有的goto语句进行错误处理使大型应用程序的开发和维护速度变得很慢,且程序不易识读。
因此,现有技术还有待于改进和发展。
发明内容
本发明的目的是提供一种使用C语言的非本地跳转工具模拟异常机制的方法,为C语言增加一种流程控制方法,实现现代面向对象语言的try catch异常机制。
本发明的技术方案包括:
一种使用C语言的非本地跳转工具模拟异常机制的方法,其包括以下步骤:
A、在每个需要跳转的流程控制点上用setimp记录调用环境(jmp_buf);
B、在调用函数或进入下一层流程时,保留指向上层调用环境的变量;
C、当执行流程需要跳转时,调用非本地跳转工具跳转到上次记录的调用环境。
所述的方法,其中,所述非本地跳转工具包括:setimp和longimp。
所述的方法,其中,还允许保留多层的调用环境,允许嵌套,同时允许在不同控制块、不同函数间跳转。
所述的方法,其中,所述实现跳转的工具代码用宏定义包装成具有trycatch样式的结构。
本发明所提供的一种使用C语言的非本地跳转工具模拟异常机制的方法,由于采用了C语言的非本地跳转工具模拟异常机制的技术方案,使C语言的流程控制更灵活、有效,代码结构清晰,可读性强,优化了开发速度,易于修改维护。
附图说明
下面将参考附图进行详细的说明。
图1是本发明的一段模拟代码,演示了使用此种方法的代码样式;
图2是本发明模拟代码的流程图,表示了不同情况下的流程。
具体实施方式
下面将详细说明实现本发明目的的具体实施方法,但本发明的内容不仅限于此种办法,也不限于此种宏定义,使用其它实施方法实现本发明目的的也将落入本发明专利保护范围之内。
本发明使用C语言的非本地跳转工具模拟异常机制的方法所使用的C语言非本地跳转工具包括setjmp和longjmp,用以模拟现代面向对象语言的try catch异常机制。setjmp和longjmp是基本的跳转工具,是本发明模拟技术的基础,在现有技术的C语言中,setjmp和longjmp这两个指令只是在行之间完成跳转功能,而不能实现异常流程机制的处理。
实现本发明使用C语言的非本地跳转工具模拟异常机制的方法,如图1和图2所示,包括以下步骤:
A、在每个需要跳转的流程控制点上用setjmp把调用环境(jmp_buf)记录起来;
B、在调用函数或者进入下一层流程时,保留指向上层调用环境的变量;
C、当执行流程需要跳转时,调用longjmp跳转到上次记录的调用环境,如此即可实现流程跳转。
本发明方法允许保留多层的调用环境,允许嵌套,同时允许在不同控制块、不同函数间跳转,实现跳转的工具代码,可以用宏定义包装成具有trycatch样式的结构。
定义宏的结构如下:
#define TRY\
{\
int_jmp_ret;\
jmp_buf_jmp_mark_;\
if((_jmp_ret_=setjmp(_jmp_mark_))==0){
#define CATCH(value)\
}else if(_jmp_ret_==(value)){
#define END_CATCH\
}else{\
longjmp(*_jmp_mark_prev_,_jmp_ret_);\
}}
#define TERMINATE_CATCH\
}}
#define SUB_TRY\
{\
jmp_buf*const_jmp_mark_prev_=&_jmp_mark;\
jmp_buf_jmp_mark_;\
if((_jmp_ret_=setjmp_jmp_mark_))==0){
#define THROW(value)\
longjmp(*_jmp_mark_prev_,(value))
#define RAISE(value)\
longjmp(_jmp_mark_,(value))
作为实现本发明目的的一种具体实施方式,可定义TRY、CATCH、END CATCH、TERMINATE_CATCH、SUB_TRY、THROW、RAISE等一序列的宏。TRY、CATCH、END_CATCH、TERMINATE_CATCH用于包装第一个try catch的流程控制块。SUB_TRY、CATCH、END_CATCH、TERMINATE_CATCH用于包装内嵌于外部控制块里的子控制块。THROW、RAISE用于模拟抛出异常,THROW用于向外层控制块抛出异常;RAISE用于向本控制块抛出异常。
下面就本发明模拟机制的用法做进一步说明,代码参见图1所示:其代码段里包含两个函数,test()和main()。假设test()在执行时,要向外部的调用者main()报告出现了某些错误情况,使用本发明异常模拟机制不使用返回值表示执行结果,代替为使用宏THROW(n),向main()函数抛出一个错误号n,见(5)号标记。
其中,假如n=1,将会被内嵌的SUB_TRY、CATCH捕获到,在(1)号标记,这时屏幕上将会打印出:
catch exception 1。
假如n=2,将会在(2)号标记处捕获到,这时屏幕上将会打印出:
catch exception 2。
假如n=3,n的值不能被内嵌的SUB_TRY、CATCH捕获到,这时n会被抛出到外层的TRY、CATCH语句块,在(3)号标记处捕获到。
同样的,假如n=4,将在(4)号标记处捕获到。
假如,代码没有调用函数test(),也可以使用RAISE(n)来引发一个流程控制跳转,情况和调用test()相似。
本发明方法利用现有C语言中的非本地跳转工具包括setjmp和longjmp,通过宏结构的包装,模拟实现了面向对象的try catch异常机制,其在嵌入式系统中实现了流程控制的更灵活、有效,而且代码结构清晰,可读性强,优化了开发速度,易于修改维护。
应当理解的是,上述针对本发明较佳实施例的描述较为具体,并不能因此而认为是对本发明专利保护范围的限制,本发明的专利保护范围应以所附权利要求为准。
Claims (4)
1、一种使用C语言的非本地跳转工具模拟异常机制的方法,其包括以下步骤:
A、在每个需要跳转的流程控制点上用setjmp记录调用环境(jmp_buf);
B、在调用函数或进入下一层流程时,保留指向上层调用环境的变量;
C、当执行流程需要跳转时,调用非本地跳转工具跳转到上次记录的调用环境。
2、根据权利要求1所述的方法,其特征在于,所述非本地跳转工具包括:setjmp和longjmp。
3、根据权利要求2所述的方法,其特征在于,还允许保留多层的调用环境,允许嵌套,同时允许在不同控制块、不同函数间跳转。
4、根据权利要求3所述的方法,其特征在于,所述实现跳转的工具代码用宏定义包装成具有try catch样式的结构。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200610063315 CN1952880A (zh) | 2006-10-26 | 2006-10-26 | 一种使用c语言的非本地跳转工具模拟异常机制的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200610063315 CN1952880A (zh) | 2006-10-26 | 2006-10-26 | 一种使用c语言的非本地跳转工具模拟异常机制的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1952880A true CN1952880A (zh) | 2007-04-25 |
Family
ID=38059237
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200610063315 Pending CN1952880A (zh) | 2006-10-26 | 2006-10-26 | 一种使用c语言的非本地跳转工具模拟异常机制的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1952880A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2009146612A1 (zh) * | 2008-06-03 | 2009-12-10 | 华为技术有限公司 | 嵌入式c语言环境下异常处理方法及装置 |
CN102214095A (zh) * | 2010-04-07 | 2011-10-12 | 微软公司 | 从基于非异常的模型中生成基于异常的组件模型 |
CN112286697A (zh) * | 2020-11-06 | 2021-01-29 | 上海新时达机器人有限公司 | 基于无操作系统单片机平台的互斥资源访问方法 |
-
2006
- 2006-10-26 CN CN 200610063315 patent/CN1952880A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2009146612A1 (zh) * | 2008-06-03 | 2009-12-10 | 华为技术有限公司 | 嵌入式c语言环境下异常处理方法及装置 |
CN102214095A (zh) * | 2010-04-07 | 2011-10-12 | 微软公司 | 从基于非异常的模型中生成基于异常的组件模型 |
CN112286697A (zh) * | 2020-11-06 | 2021-01-29 | 上海新时达机器人有限公司 | 基于无操作系统单片机平台的互斥资源访问方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Ke et al. | COMDES-II: A component-based framework for generative development of distributed real-time control systems | |
CN105808266B (zh) | 代码运行方法及装置 | |
CN103123598B (zh) | 一种编译型软plc的在线调试实现方法 | |
CN101859244A (zh) | 多工具链工程构建方法及系统 | |
CN105676808B (zh) | 一种工业控制系统逻辑断点调试功能的实现方法 | |
CN101246449B (zh) | 跟踪函数调用轨迹的方法和装置 | |
CN104462943A (zh) | 业务系统中非侵入式性能监控装置和方法 | |
CN104035778A (zh) | 一种Android应用程序开发方法 | |
CN1952880A (zh) | 一种使用c语言的非本地跳转工具模拟异常机制的方法 | |
CN102566481B (zh) | 一种基于c语言的plc控制系统及其实现方法 | |
CN101916223A (zh) | 程序调试方法及系统 | |
CN103049602B (zh) | 基于模型驱动工程的将aadl组件转换到接口自动机模型方法 | |
Schmidt et al. | Predictable component architectures using dependent finite state machines | |
JP2009525509A (ja) | 制御フロー保護機構 | |
CN102750177A (zh) | 一种使用编译器的脚本实现方法 | |
CN104111838B (zh) | 一种有轨电车综合调度联动逻辑实现方法 | |
Bruno et al. | CAB: An environment for developing concurrent application | |
CN100389411C (zh) | 在嵌入式实时操作系统中实现逻辑中断优先级的方法 | |
Göbe et al. | Synthesis tool for automation controller supervision | |
Brodsky et al. | CoJava: a unified language for simulation and optimization | |
Huang et al. | Deadline analysis of AUTOSAR OS periodic tasks in the presence of interrupts | |
CN110874209A (zh) | 一种生成分布式系统中唯一标识的方法 | |
Halang | Analysing PEARL Programs for Timely Schedulability and Executability | |
Śnieżek et al. | A fail safe programmable logic controller | |
Newby | Legacy systems, software maintenance and computing curricula |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Open date: 20070425 |