/*******************************************************************************
* 版权所有:
* 模 块 名:
* 文 件 名:volatile_setjmp.c
* 实现功能:
* 作 者:XYZ
* 版 本:V1.0
* 日 期:2013.11.15
* 联系方式:xiao13149920@foxmail.com
********************************************************************************/
// volatile_setjmp.c
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h> static jmp_buf env; static void do_jump(int nvar, int rvar, int vvar)
{
printf("Inside do_jump(): nvar:%d, rvar:%d, vvar:%d\n", nvar, rvar, vvar);
longjmp(env, );
} int main(int argc, char *argv[])
{
int nvar;
register int rvar; // allocated in register if possible
volatile int vvar; // see text nvar = ;
rvar = ;
vvar = ; if (setjmp(env) == )
{
nvar = ;
rvar = ;
vvar = ;
do_jump(nvar, rvar, vvar);
}
else
{
printf("After do_jump(): nvar:%d, rvar:%d, vvar:%d\n", nvar, rvar, vvar);
} return ;
}

1. When we compile the program with

gcc -o volatile_setjmp volatile_setjmp.c

and the output :

Inside do_jump(): nvar:777, rvar:888, vvar:999
After do_jump(): nvar:777, rvar:888, vvar:999

2.However, when we compile with optimization

gcc -O -o volatile_setjmp volatile_setjmp.

we get the following unexpected results:

Inside do_jump(): nvar:777, rvar:888, vvar:999
After do_jump(): nvar:111, rvar:222, vvar:999

We can prevent such code reorganization by declaring variables as volatile,which tells the optimizer not to optimizethem. In the preceding program output,we see that the variable vvar, which was declared volatile, was correctly handled,even when we compiled with optimization.

longjmp setjmp and volatile的更多相关文章

  1. C++异常实现与longjmp, setjmp,栈指针EBP, Active Record

    这篇讲的不错: http://blog.csdn.net/smstong/article/details/50728022 首先Active Record 然后EBP,ESP等指针 2 通过setjm ...

  2. apue学习笔记(第七章 进程环境)

    本章将了解进程的环境. main函数 C程序总是从main函数开始执行,main函数的原型是: int main(int argc,char *argv[]); 其中,argc是命令行参数的数目,ar ...

  3. 用arm-linux-gcc v4.3.4交叉编译Qt4.8.3

    1.解压缩 #tar zxvf  qt-everywhere-opensource-src-4.8.3.tar.gz 2. configure #mkdir buildarm-static #cd b ...

  4. C高级 跨平台协程库

    1.0 协程库引言 协程对于上层语言还是比较常见的. 例如C# 中 yield retrun, lua 中 coroutine.yield 等来构建同步并发的程序. 本文就是探讨如何从底层实现开发级别 ...

  5. 鸿蒙内核源码分析(汇编汇总篇) | 所有的汇编代码都在这里 | 百篇博客分析OpenHarmony源码 | v40.03

    百篇博客系列篇.本篇为: v40.xx 鸿蒙内核源码分析(汇编汇总篇) | 汇编可爱如邻家女孩 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

  6. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

  7. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

    目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...

  8. 【转】浅析C语言的非局部跳转:setjmp和longjmp

    转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...

  9. 进程环境之setjmp和longjmp函数

    在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...

随机推荐

  1. ASP.NET MVC Jquery Validate 表单验证的多种方式

    在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...

  2. [转] - Configuring Android Studio: IDE & VM Options, JDK, etc

    Configuring Android Studio: IDE & VM Options, JDK, etc You should not edit any files in the IDE ...

  3. mac 安装命令行开发者工具

    terminal中执行: xcode-select --install然后点击 “安装”即可 mac命令行工具

  4. js 判断 是否位数字

    isNaN(val) val为数字返回false 不为数字返回truedocument.write(isNaN(123)); document.write(isNaN(-1.23)); documen ...

  5. git 使用 总结

    比较好的教程 http://backlogtool.com/git-guide/cn/intro/intro1_2.html 1.git流程图 2.git 新建仓库 git init git clon ...

  6. SpringMVC之controller篇

    概述 继 spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  7. Android编译环境折腾记

    题记:感觉是时候写点什么了=_=! 第一次安装了ubuntu14.04.5,官网下载的iso,官网下的jar,编译android4.x需要安装jdk6,更高的版本会有问题,baidu到很多搭建环境的步 ...

  8. [C语言入门笔记]循环与运算符

    循环与运算符 什么是循环? 循环就是一个不停工作的东西,可以反复的实现一个功能,这个才是计算机的重点.计算机可以重复的做一件事情,这样子可以省很多事情 循环的种类有哪些? While Do while ...

  9. SPSS数据分析—判别分析

    判别分析作为一种多元分析技术应用相当广泛,和其他多元分析技术不同,判别分析并没有将降维作为主要任务,而是通过建立判别函数来概括各维度之间的差异,并且根据这个判别函数,将新加入的未知类别的样本进行归类, ...

  10. Android NDK 项目依赖简单示例

    目录文件结构如图, 进入main目录执行命令 .ndkbuild NDK_MODULE_PATH=../ 说明 .ndkbuild请替换成有效的ndk-build的命令 所有文件下载 http://p ...