C语言#define和const问题

丿执念 2013-10-21 01:28:32
C primer plus书中介绍C预处理器和C库一章中有个例子,

#define LIMIT 2
const int LIM = 3;
static int data1[LIMIT]; //合法
static int data2[LIM];//无效
const int LIM2 = 2 * LIMIT;//合法
const int LIM3 = 2 * LIM;//无效

我自己试了试,代码如下。确实有错误,谁能告诉我为什么上面两个会无效。

#include<stdio.h>
#define LIMIT 2
const int LIM = 3;
int main(){
static int data1[LIMIT] = {1,2};
static int data2[LIM]={1,2,3};
const int LIM2 = 2 * LIMIT;
const int LIM3 = 2 * LIM;
printf("%d %d\n", LIM2, LIM3);
for(int i = 0;i < 2; i++)
printf("%d ", data1[i]);
printf("\n");
for(int i = 0; i < 3; i++)
printf("%d ", data2[i]);
printf("\n");

return 0;
}
...全文
299 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊熊大叔 2013-10-21
  • 打赏
  • 举报
回复
const在c++中是常量, 在c中是readonly的变量. 因此在c中要求输入常量的地方不能用const变量, c++中就没有问题
赵4老师 2013-10-21
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
lin5161678 2013-10-21
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
const int LIM = 3; static int data1[LIM*2]; 也是没有问题
C++可以 因为对C++来说 LIM是常量 C不行 因为对C来说 LIM*2是变量 对应VLA 而VLA 不允许static
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
const int LIM = 3; static int data1[LIM*2]; 也是没有问题
你是用的C++的编译器吧
worldy 2013-10-21
  • 打赏
  • 举报
回复
const int LIM = 3; static int data1[LIM*2]; 也是没有问题
worldy 2013-10-21
  • 打赏
  • 举报
回复
#define COUNT 3 static int a[COUNT]; vs2008下没有问题,估计你是设置了什么编译选项了
lin5161678 2013-10-21
  • 打赏
  • 举报
回复
引用 6 楼 wangdahu888 的回复:
const变量在C++是编译期常量,在C中是运行时的常量。所以以下代码在C++中能编译通过。在C中不行。

const int LEN = 100;
char str[LEN + 1];
C中也行 VLA 不是全局变量不是static 没初始化的时候 可以那样写 吧const去掉都可以
  • 打赏
  • 举报
回复
const变量在C++是编译期常量,在C中是运行时的常量。所以以下代码在C++中能编译通过。在C中不行。

const int LEN = 100;
char str[LEN + 1];
做或不做 2013-10-21
  • 打赏
  • 举报
回复
比如 const int LIM = 3; 只要这样一些 int(LIM)这个值貌似就可以改变了 所以编译器认为这种结果是无定义的 是不可预测的
lin5161678 2013-10-21
  • 打赏
  • 举报
回复
static int data2[LIM]={1,2,3}; 不合法是因为 VLA 要求不能初始化 不是static 2个禁忌都犯了 const int LIM3 = 2 * LIM; 不合法是const初始化 需要常量 LIM不是常量 LIM是一个左值
lin5161678 2013-10-21
  • 打赏
  • 举报
回复
哪一版的C primer plus ??
做或不做 2013-10-21
  • 打赏
  • 举报
回复
static int data2[LIM];// 不合法是因为当声明一个数组的时候,要求数组的长度是一个常量; 虽然可以用const来定义一个变量,使得它的值不被改变。但是,改变量也不能变成一个常量。
hustgonia 2013-10-21
  • 打赏
  • 举报
回复
坚决消灭令恢复。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧