免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hello|world
打印 上一主题 下一主题

[C] 请教: 怎样判断一个变量是只读的(const)? [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
21 [报告]
发表于 2011-02-15 12:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
22 [报告]
发表于 2011-02-15 13:28 |只看该作者
要是 C++ 倒还可以折腾一下,不过楼主问的是 C,这个除了各种 hacking 以外还真没什么办法……

论坛徽章:
0
23 [报告]
发表于 2011-02-15 16:04 |只看该作者
举个例子, 提供一个字符串操作函数,比如trim, 调用者如果将常量或者只读变量作为参数调用的话,程序COREDUMP,偶然想到,所以由此一问,通过程序的方法去屏蔽人的错误;

论坛徽章:
0
24 [报告]
发表于 2011-02-15 16:11 |只看该作者
举个例子, 提供一个字符串操作函数,比如trim, 调用者如果将常量或者只读变量作为参数调用的话,程序COREDUMP ...
hello|world 发表于 2011-02-15 16:04


那是调用者的错,不是你的错,你只需要在接口规范中把条件说明就行了。

论坛徽章:
0
25 [报告]
发表于 2011-02-15 16:18 |只看该作者
回复 24# davelv


    其实就像现实中有很多交通法规,但也有很多人不遵守, 交通事故频发,  使用方法让不遵守其中一条规则的人不至于有生命危险, 虽然他死不死确实跟我无关...

论坛徽章:
0
26 [报告]
发表于 2011-02-15 17:27 |只看该作者
做好自己的事情就可以了,考虑太多会影响原本目的。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
27 [报告]
发表于 2011-02-15 20:08 |只看该作者
用objdump看这个变量符号的存在位置,如果在.rodata则是只读的。
davelv 发表于 2011-02-15 10:38


    局部变量呢?局部变量怎么办?


对于C来说,const只作用域编译期,在运行时这些信息早就丢了。不过问题是,如果是函数参数的话,函数得到的不是副本吗?如果是带const修饰的指针,传递给普通指针至少也应该有警告吧?

论坛徽章:
0
28 [报告]
发表于 2011-02-15 20:42 |只看该作者
以下代码能够工作
  1. template <class T> bool isConst(T& n) {return false;}
  2. template <class T> bool isConst(const T& n) {return true;}
复制代码
真实情况是,这样才是想要的(库中经常出现)
  1. template <class T> class IsConst;

  2. template <class T>
  3. class IsConst {
  4. public:
  5.         enum {result = false};
  6. };

  7. template <class T>
  8. class IsConst <const T> {
  9. public:
  10.         enum {result = true};
  11. };
复制代码

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
29 [报告]
发表于 2011-02-15 21:07 |只看该作者
回复 23# hello|world

蛋疼……

磁盘数据会出错, 是不是也该想个办法检测并修复? 这还有专门的技术去纠错。
那内存中的坏区怎么办? 是否应该每个程序都考虑这个问题, 写段代码去检测一下?
更严重的, 网线、电源会被拔, 又该如何处理?

把 "string literal" 当作是只读的, 无论它实际存储在什么区域。

论坛徽章:
0
30 [报告]
发表于 2011-02-15 22:06 |只看该作者
const的意思是只读,不是常量。
如24楼所说,这个问题还是丢给函数调用者吧,c语言的理念是:相信程序员所做的事都是对的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP