打印

GCC中volatile声明变量的问题

[复制链接]
9535|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alphal|  楼主 | 2008-8-18 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序语句:
#include <string.h>
1    unsigned char volatile tempBuf[10];
2    memset(tempBuf, 0x0, sizeof(tempBuf));
用GCC编译器编译,会产生如下警告:
passing argument 1 of 'memset' discards qualifiers form pointer targe type;
把第1句中的volatile去掉或第二句tempBuf前加强制类型转换(unsigned char *),警告消失.
难道第1句中用volatile后tempBuf的类型变了,不是指针类型了??
而用C51编译器则不会有任何警告.

[volatile关键字本身的意义及作用此处不需讨论,网上有很多资料]

相关帖子

沙发
djyos| | 2008-8-18 16:05 | 只看该作者

明摆着的还问

unsigned char volatile* 和
unsigned char*
不明摆着是两种不同的类型嘛。
c51不告警说明c51不够严谨。
严谨的编译器能帮助程序员避免许多低级错误。

使用特权

评论回复
板凳
alphal|  楼主 | 2008-8-18 16:48 | 只看该作者

.

unsigned char volatile* 声明一个uchar型,这个变量易变(volatile),不应被优化...

volatile怎么就使这个变量的"类型"改变了呢,这个变了后的类型是什么样的类型??

使用特权

评论回复
地板
djyos| | 2008-8-18 20:38 | 只看该作者

如何理解类型

类型不能仅仅理解为解释数据结果的方式,这不是C类型系统的初衷。
const,volatile与signed,unsigned一样,都是构成类型的要素。

使用特权

评论回复
5
alphal|  楼主 | 2008-8-19 09:49 | 只看该作者

谢谢djyos

"const,volatile与signed,unsigned一样,都是构成类型的要素."

似乎有道理,但是我之前还没有见过这样的表述..不知道哪儿能找到更详细,系统的介绍?

使用特权

评论回复
6
djyos| | 2008-8-19 11:50 | 只看该作者

纯粹是个人理解,不知对不对

我也没有看到过哪本书这样写,但我一直这样认为。

使用特权

评论回复
7
taoest| | 2008-8-19 12:46 | 只看该作者

volatile

volatile是针对编译器优化的指引关键词。
就是告诉编译器这个变量是随时被外部改变的,使用的时候不能用其他临时变量代替,每次针对这个变量的检测和操作都必须认真执行,不能自作聪明优化掉。
例如:
a++;a++;a++;a--;a--;a--;

这个程序,可能会被优化,然后取消掉。单从这小段程序来看,6个指令是多余的。
如果加了volatile,这些指令就会被认真执行。因为有可能有其他代码或者硬件,在使用a这个变量。

使用特权

评论回复
8
农民讲习所| | 2008-8-19 13:18 | 只看该作者

C的关键字中有

"volatile怎么就使这个变量的"类型"改变了呢,这个变了后的类型是什么样的类型??"
如果LZ把volatile换为const,就可以轻易理解了。两者是等同的地位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

112

主题

473

帖子

1

粉丝