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) |