搜索
bottom↓
回复: 7

大家一起来学C语言,有好点子多分享,求大神来帮忙、拍砖

[复制链接]

出0入0汤圆

发表于 2013-1-26 00:12:26 | 显示全部楼层 |阅读模式
类型修饰符const和volatile各种用法,如何理解,怎么用?
存储类型说明符extern、static、register的各种用法,如何理解,怎么用,跪求大神来指教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-1-26 11:10:21 | 显示全部楼层
类型修饰符const和volatile各种用法,如何理解,怎么用?
存储类型说明符extern、static、register的各种用法,如何理解,怎么用,跪求大神来指教。


先说const
const其实只是从代码的可读性和安全性去理解的,不会对最终的代码行为有多少影响,const就是“只读”的意思。
比如你给一个变量限定了const(对写代码的人来说,总很清楚哪个值需不需要改变),那如果代码里尝试去修改这个变量,编译的时候就会报错,这样会减少bug的产生。
而且代码一目了然,只要看到const修饰符,你就知道这个变量的意图是只读的,而不是可以修改的。
所以好的用法是:把你代码里所有只读的变量全部加上const。
比如char *strcpy(char *dst, const char *src) 这里的const就表示在strcpy函数里src指向的字符数据不能被改变,它只是源字符串,将被拷贝到dst。

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const char* const pContent; //pContent和*pContent都是const

出0入0汤圆

发表于 2013-1-26 11:24:27 | 显示全部楼层
关于volatile
volatile字面意思是易挥发,不稳定的意思。volatile变量是随时可能发生变化的。
编译器进行编译优化的时候,有可能会打乱某些指令的执行顺序,这对于一些硬件寄存器的赋值操作有可能是致命的,可能会改变硬件的逻辑。
另外,如果从某一个变量去读取数值,那么有可能编译器的优化结果是直接从之前刚好还存着这个值的CPU寄存器去读取数值,但假如这个值是某个外设的寄存器的话,它的值有可能被改变了,也就是说这时候从CPU那个寄存器读出来的是有误的。如果加了volatile,那最终编译产生的指令就不会有这种优化,而是硬着头皮还是再去那个地址读一遍数值。
volatile就是告诉编译器变量有关的运算,不要进行编译优化,以免出错。

出0入0汤圆

发表于 2013-1-26 13:47:06 | 显示全部楼层
extern static和register  大部分书上C语言介绍很详细
static稍微麻烦一点,有函数内和文件内两种用法,不过也比较简单。
要提一点的是static声明在文件内但是在函数外的话,只能这个.c模块自己使用,因为编译完符号表后不会有它。链接的话外部就找不到了。
所以,对于某个.c文件内部自己用的变量和函数,最好都用static修饰,避免变量或函数名冲突。

出0入0汤圆

发表于 2013-1-26 14:10:04 | 显示全部楼层
坐等大神指教

出0入0汤圆

发表于 2013-1-26 14:15:32 | 显示全部楼层
panwenjian 发表于 2013-1-26 11:10
类型修饰符const和volatile各种用法,如何理解,怎么用?
存储类型说明符extern、static、register的各种用 ...


panwenjian 的解释简单明了,顶一个

出0入0汤圆

 楼主| 发表于 2013-1-27 00:14:03 | 显示全部楼层
panwenjian 发表于 2013-1-26 11:24
关于volatile
volatile字面意思是易挥发,不稳定的意思。volatile变量是随时可能发生变化的。
编译器进行 ...

非常感谢。有时我看到const和volatile连用,这两个组合用感觉莫名奇妙的

出0入0汤圆

发表于 2013-1-27 15:32:09 | 显示全部楼层
panwenjian 发表于 2013-1-26 13:47
extern static和register  大部分书上C语言介绍很详细
static稍微麻烦一点,有函数内和文件内两种用法,不 ...

另外,extern不像static,extern只是声明,而不是定义,只是说有个外部变量,这个变量可以在本.c文件里,也可以在其他.c文件里。
比如a.c文件如下,那么gcc a.c -o a是编译不过的,确切的说是链接出错,因为找不到符号a。
extern int a;
int main()
{
   a = 8;
   return 0;
}
提示如下错误。
/tmp/ccYugDGL.o:a.c:(.text+0x2c): undefined reference to `_a' collect2: ld returned 1 exit status

另外,extern声明仅仅和符号有关,比如a.c还是像上面一样,但是b.c里面定义了函数a,而不是int a,如下所示:
int a(){}
但是gcc a.c b.c -o a.exe一样能过,说明链接的时候根本就是找符号a。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 13:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表