今天在编译一段C源程序时,遇到编译错误提示 error: variably modified 'data' at file scope。原因在于代码头部有这样几行:

const int maxsize = +;
int data[maxsize];

在C语言中,const不是一个真真正正的常量,其代表的含义仅仅是只读。使用const声明的对象是一个运行时对象,无法使用其作为某个量的初值、数组的长度、case的值或在类型的情形中使用。以上是全局的情况,那么仅在一个块中定义的情况呢?下例中const所限定的值超出其生命周期后可被修改这很容易理解不必多作解释。

 for(i = ; i < ; ++i) {
const int j = i; // 试试 const int j = rand();
printf("%d", j); // Output: 012345
}

如果要在C中定义编译时常量,也就是一个真正的常量,可以使用#define宏定义,但是#define的问题在于它是直接替换源代码中的所有匹配字符串,容易造成误替换,因此对于像int型这样的情况可以耍点小把戏,就像这样:

 enum {length = };  // Or: #define length 256
int a[length];

那么我们经常说const也并非不可修改,利用某些小技巧可以绕过只读约束,下面的例子中被const限定的t就仍然可被修改:

 const int t = ;
*(int*)&t = ;
printf("%d",t); // Output: 0

值得注意的是,在C++中可用const修饰的变量作为数组的长度。

参考链接: http://xsk.tehon.org/den/index.php/category/tech/c-variably-modified-array-at-file-scope.html

最新文章

  1. 【leetcode】Majority Element
  2. web安全之xss
  3. hdu 4967 Handling the Past
  4. php构造函数连接数据库
  5. 在SQL Server里如何进行页级别的恢复
  6. jdownload的使用
  7. bug记录
  8. Oracle 监听器日志文件过大导致监听异常
  9. MSSQL中建立分区表(转载备忘)
  10. Apache 开启 Https
  11. 在ubuntu安装Phabricator(转)
  12. PHP扩展开发-简单类扩展
  13. Spring IO Platform简介及示例
  14. bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
  15. dubbo+zookeeper+springBoot框架整合与dubbo泛型调用演示
  16. css预编译语言sass——mixin的使用
  17. python面向对象编程 -- 封装、继承
  18. win2003 序列号 windows2003 sp2可用序列号大全(准版与企业版)
  19. (网页)the server responded with a status of 403 (Forbidden)
  20. WEB入门之十二 jquery简介

热门文章

  1. Python基础总结之初步认识---class类(中)。第十四天开始(新手可相互督促)
  2. codeforces 1244C (思维 or 扩展欧几里得)
  3. selenium登录实验楼
  4. Go-函数高级使用-条件分支-包管理-for循环-switch语句-数组及切片-与或非逻辑符
  5. 牛客 197E 01串
  6. 怎样获取所有的embed节点对象
  7. NetCore2.x 使用Log4Net(一)
  8. Cron 表达式详解
  9. 【小知识点】input输入框在安卓以及IOS手机中光标及字体不居中解决方法
  10. 9.SpringMVC注解式开发-处理器的请求映射规则的定义