免费注册 查看新帖 |

Chinaunix

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

求大神,C语言中编译时判断某个变量是否为常量 [复制链接]

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
11 [报告]
发表于 2012-04-07 19:50 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. static char addr_const;

  4. int main()
  5. {
  6.         char *p1="abc";
  7.         char p2[]="abc";
  8.         char *p3=(char*)malloc(10);
  9.         if(is_const(p1))
  10.                 printf("p1 is const\n");
  11.         if(is_const(p2))
  12.                 printf("p1 is const\n");
  13.         if(is_const(p3))
  14.                 printf("p1 is const\n");
  15.        
  16.         return 0;
  17. }

  18. inline is_const(void *p)
  19. {       
  20.         return ((void*)p < (void*)&addr_const)?1:0;
  21. }
复制代码
  1. cokebol@ubuntu:~$ ./a.out
  2. p1 is const
  3. gaofeng@ubuntu:~$
复制代码

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

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
13 [报告]
发表于 2012-04-07 20:06 |只看该作者
  1. char addr_const;
  2. #define is_const(p) (((void*)(p) < (void*)&addr_const)?1:0)

  3. int main()
复制代码

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
14 [报告]
发表于 2012-04-07 22:02 |只看该作者
很难做到. 不知道编译器有没有提供什么扩展.

论坛徽章:
0
15 [报告]
发表于 2012-04-07 22:14 |只看该作者
在操作系统里面一个对象能不能被修改取决于编译器编译时对该对象属性的设置。所以要达到你的要求只能看编译器的手册或目标系统的API了

论坛徽章:
0
16 [报告]
发表于 2012-04-07 22:48 |只看该作者
回复 10# cokeboL


    怎么确定const内存起始地址呢?

论坛徽章:
0
17 [报告]
发表于 2012-04-07 22:53 |只看该作者
回复 11# cokeboL


    你在开头static char addr_const,这个变量的地址不一定是在静态储存区的开头吧,如果我在定义别的static之类的,会不会引起下面函数的判断失效?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
18 [报告]
发表于 2012-04-08 02:19 |只看该作者
回复 17# wuchen20x


    应该是 静态区(初始化的data和未初始化的bss)在 代码段(包括文字常量和程序代码)后面吧,所以"abc"地址应该是比static或者全局
  
   变量的地址低吧。

论坛徽章:
0
19 [报告]
发表于 2012-04-08 09:05 |只看该作者
这个应该是由程序员来保证的吧。。。C程序员。

论坛徽章:
0
20 [报告]
发表于 2012-04-08 10:25 |只看该作者
gcc 内置支持函数:__builtin_constant_p(x)

比如:
              if(__builtin_constant_p(x)) {
                   ....
               } else {
                   ...
               }
这个判断是在编译时确定的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP