const 和 volatile为什么能同时定义一个变量

wendy_welcom 2007-12-10 02:21:53
< c primer plus > 书上的一段话,请前辈不吝执教,const 和 volatile怎么能同时定义一个变量呢,不明白。谢谢。
一个值可以同时是vonst和volatile。例如,硬件时钟一般设定为不能由程序改变,这一点使他成为const; 但它被程序以外的代理改变,这使它成为volatile的。只需在声明中同时使用这两个限定词,如下所示,顺序并不重要:
volatile const int ioc;
const volatile int *ploc;
...全文
6223 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjwxiaoma 2011-07-19
  • 打赏
  • 举报
回复
学习ING
laoshizhuce 2010-10-04
  • 打赏
  • 举报
回复
steedhorse回答的很精辟,不愧是CSDN专家

MARK
ForestDB 2007-12-13
  • 打赏
  • 举报
回复
const说的是不让你改,并没有说不让别的东西改;而volatile说的就是可能会被别人改的。
JobSeeker 2007-12-11
  • 打赏
  • 举报
回复
ls的英文太糟糕了,no offence,but...建议你用中文翻译一下吧,老子看不懂。

“volatile const int ioc”
这个通常用于声明,而不是定义,比如:
file A:
int ioc;//定义变量

file B:
extern volatile const int ioc;//

或许file C:
extern volatile int ioc;//

这样B不能修改ioc,且每次读取ioc的时候都会从内存里读。

不过上面的例子在VC上不能运行,因为VC试图保证联接的时候的类型安全(无聊的决策),gcc是没有问题的
shuaihonggao 2007-12-11
  • 打赏
  • 举报
回复
对于const来说,应该理解为只读的意思,如果一个变量被定义为const了,那么它告诉使用者这个变量是只读的,不要试图在当前的模块中改变它。
而对于volatile来说,它是告诉编译器,这个被声明的变量可能在本程序之外被修改,告诉编译器每次在使用这个变量的时候都需要重新加载,不能优化。
举个例子:
我们现在有个变量A ,它表示的是一个寄存器的内容,而在我们的程序当中如果是不可以修改寄存器内容的,因此A应该声明为const,而寄存器的值是和外设相关的,是不受我们程序控制的,程序可能只是检测这个值,因此A又应该设置为volatile。

本人愚见,忘高手赐教!
shuaihonggao 2007-12-11
  • 打赏
  • 举报
回复
对于const来说,应该理解为只读的意思,如果一个变量被定义为const了,那么它告诉使用者这个变量是只读的,不要试图在当前的模块中改变它。
而对于volatile来说,它是告诉编译器,这个被声明的变量可能在本程序之外被修改,告诉编译器每次在使用这个变量的时候都需要重新加载,不能优化。
举个例子:
我们现在有个变量A ,它表示的是一个寄存器的内容,而在我们的程序当中如果是不可以修改寄存器内容的,因此A应该声明为const,而寄存器的值是和外设相关的,是不受我们程序控制的,程序可能只是检测这个值,因此A又应该设置为volatile。

本人愚见,忘高手赐教!
internazelo 2007-12-11
  • 打赏
  • 举报
回复
举个简单的例子。只读的状态寄存器,它是volatile,因为它可能被意想不到地改变。
它是const,因为程序不应该试图去修改它。
C_coding 2007-12-11
  • 打赏
  • 举报
回复
> JobSeeker
> 朋友的淘宝网
> 等 级:
> 发表于:2007-12-11 00:57:3434楼 得分:0
> ls的英文太糟糕了,no offence,but...建议你用中文翻译一下吧,老子看不懂。
>

You're not expected to understand that because you're a fool. You know neither English language nor the C language.

> “volatile const int ioc”
> 这个通常用于声明,而不是定义,比如:
> file A:
> int ioc;//定义变量
>
> file B:
> extern volatile const int ioc;//
>
> 或许file C:
> extern volatile int ioc;//
>
> 这样B不能修改ioc,且每次读取ioc的时候都会从内存里读。
>
> 不过上面的例子在VC上不能运行,因为VC试图保证联接的时候的类型安全(无聊的决策),gcc是没有问题的
>

You told people that you're really a fool by presenting this rubbish.

By the way, if there're some people can explain why that fool was wrong with that code, they will be given awards :-D
xx_hzbzlp 2007-12-11
  • 打赏
  • 举报
回复
const:变量不能为代码直接修改,但可以间接或通过外部的一些触发(如管脚或寄存器等).
volatile:编译器不能假设程序在运行中执有变量的一个副本.
prime1213 2007-12-11
  • 打赏
  • 举报
回复
up
C_coding 2007-12-10
  • 打赏
  • 举报
回复
The code with volatile is more likely to break at optimization. For example, the following code may not print what you think it should be with this type qualifier.


int main(void)
{
int volatile const len = 10;
int m;

m = len * 2;
printf("%d\n", m);
return 0;
}
hunter15 2007-12-10
  • 打赏
  • 举报
回复
同意29
skywarship 2007-12-10
  • 打赏
  • 举报
回复
回12楼

那个函数只是表示将intr_func注册到中断处理的意思,并不是真实的函数
长安宁 2007-12-10
  • 打赏
  • 举报
回复
这个非常类似 static 修饰变量的时候,如果只是声明,可以这样写;
那么以后,赋过初值了就不可以再变了;OK?
晨星 2007-12-10
  • 打赏
  • 举报
回复
只不过需要明白“volatile”的含义并非是“non-const”。所以他们才可以放在一起。
在C++语言中,const没有反义词,如果一个变量没有const修饰,那它本身就是const的反义词,而并非加上volatile才是const的反义词。
wendy_welcom 2007-12-10
  • 打赏
  • 举报
回复
谢谢各位前辈们的悉心指点, 感激之感用分数和话语不足以表达。 真的谢谢大家。
晨星 2007-12-10
  • 打赏
  • 举报
回复
对于非指针非引用的变量,const volatile同时修饰的意义确实不大。
个人觉得。
firemcu123 2007-12-10
  • 打赏
  • 举报
回复

const volatile int a is uaually used in multithreading and Interrupt Service Program.
ie521 2007-12-10
  • 打赏
  • 举报
回复
skywarship

Jim_King_2000

steedhorse

几位兄台都说得很明白了
Jim_King_2000 2007-12-10
  • 打赏
  • 举报
回复
const volatile int a;应该来说很少会遇到吧?在这里没有必要加上volatile的。
加载更多回复(23)

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧