Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300209
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2009-08-30 17:05:18

1.volatile变量
   某些和底层硬件通信的程序,它们的有些变量会随着系统时间变化而变化,或者在多线程程序之中,被其它线程更改,对于这种随时需要最新值的变量要定义成volatile型,以告诉编译器不用对它们进行优化。
   来自网上牛人的讲解如下:
所谓的不可见,是指编译器不可预见.  
  具体实现包括中断例程,多线程都可以改变变量的值.  
  举个例子:  
  volatile   int   v;  
   
  void   func()  
  {   int   a,b;  
      a=5*v;  
      b=5*v;  
      ....  
  }  
   
  如果v是个普通的变量,编译器很可能会做这样的优化, 第一次计算出5*v的值后,先赋给a,然后直接又从寄存赋给b,  而不会重新计算5*v.   但是在执行a=5*v之后,有可能恰好在此时出现中断,将v的值改变,这时再执行=5*v,结果应该是a和b的值不相同, 但如果编译器按上面的规则一优化,则a和b永远会相同,为了避免出现这种情况,于是将v定义成volatile的.
  定义成volatile,编译器则不会做任何优化,每次都会重新读取v的值.

2.链接指示 extern "c",下面部分内容转载
http://blog.csdn.net/playingguitar/archive/2006/08/15/1066127.aspx

在C++中 extern "C" 的两种用法

1. 如果要在C++程序中调用C语言写的函数, 在C++程序里边用 extern "C" 修饰要被调用的这个C程序,告诉C++编译器此函数是C语言写的,是C语言编译器生成的,调用他的时候请按照C语言习惯传递参数等。如:

     //在C++程序里边声明该函数
      extern "C" int strcmp(const char *s1, const char *s2);

也可以这样,说明该头文件中所有函数全是用连接指示语言所编写的

     //在C++程序里边声明该函数
      extern "C" {
             #include 
<string.h>  //string.h里边包含了所要调用的函数的声明
      }

2. 用C++语言写的一个函数,如果想让这个函数可以被其他C语言程序所用,则用extern "C" 来告诉C++编译器,请用C语言习惯来编译此函数。如:

      //在C++程序里该函数
      extern "C" int strcmp(const char *s1, const char *s2)
      {
        
while (*s1 && *s1++ == *s2++) {
        }
 
        
return *s1 - *s2;
      }

注意:在第二种情况中,由于C语言并不支持函数重载,所以不可以有两个同样的函数名,如
extern "C" void func(int){...}
extern "C" int func(int *){...}
这样是会报错的,将第二个改为
extern int func(int *){...}
C程序和C++程序可以调用第一个func,第二个只能在C++中调用。
另:函数前的extern表示函数没有定义在当前文件内,与static相对(表当前函数只在此文件可见)
阅读(1054) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~