注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

C - 编译错误:'XXX'的存储大小不是常量 | Compile error:'XXX' storage size is not constant  

2012-06-15 20:03:36|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

环境 | Enviroment

操作系统:RedHat 5.7 64bit
GCC: 4.1.2

问题及解决方法  | Problem and solution

问题描述
示例代码:

const char *formatTime(time_t time){
    if (0 == time) {
        return "";
    }

    const int TIME_SIZE = 20;
    static char result[TIME_SIZE];
    struct tm *timeStruct = localtime(&time);
    size_t len = strftime(result, TIME_SIZE, "%Y-%m-%d %H:%M:%S", timeStruct);
    if (0 == len) {
        fprintf(stderr, "execute function strftime fail");
    }

    return result;
}

编译警告信息:
./Stat.c: In function ‘formatTime’:
./Stat.c:85: 错误:‘result’ 的存储大小不是常量

原因
1)这个问题其实是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”等是只读的,不能够修改。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量TIME_SIZE被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。
2)在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。
3)在ANSI C 语言中用#define宏来定义常量。

C - 编译错误:XXX的存储大小不是常量 | Compile error:XXX storage size is not constant - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来解决方法
#define TIME_SIZE 20
... ... ... 省略部分代码 .........
const char *formatTime(time_t time){
    if (0 == time) {
        return "";
    }

    static char result[TIME_SIZE];
    struct tm *timeStruct = localtime(&time);
    size_t len = strftime(result, TIME_SIZE, "%Y-%m-%d %H:%M:%S", timeStruct);
    if (0 == len) {
        fprintf(stderr, "execute function strftime fail");
    }

    return result;
}

<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2012年06月15日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容!

  评论这张
 
阅读(1107)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017